![如何创建并执行从更高文件夹调用可执行文件的 bash 脚本?](https://linux22.com/image/3356/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E5%B9%B6%E6%89%A7%E8%A1%8C%E4%BB%8E%E6%9B%B4%E9%AB%98%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B0%83%E7%94%A8%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E7%9A%84%20bash%20%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
我正在尝试编写一个非常简单的脚本,该脚本从更高级别的文件夹中调用可执行文件。如果我只是在控制台中输入命令,我会输入
../filenamehere {options} {parameters}
当我尝试在 .sh 文件中执行相同的操作以便同时运行多个进程时,我尝试编写以下内容:
../filename {options} {parameters} &
../filename {options2} {parameters} &
../filename {options3} {parameters} &
../filename {options4} {parameters} &
然后,为了运行该文件,我输入
chmod a+x script_file.sh
./script_file.sh
此后,我出现了 3 次“未找到命令”错误。我认为这意味着我的 4 个命令中的 1 个已执行,但其他 3 个没有执行。如果我直接在控制台中键入与在 .sh 文件中输入的命令完全相同的命令,则不会出现任何问题。我需要做什么才能让这个文件运行?
答案1
您使用符号链接吗?
要编写可靠的脚本,您不应使用“dirname $0”。它与$0命令相关,而$0命令又与调用命令相关。如果您要跨目录导航,请使用“readlink -f $0”。
basedir="$(dirname $(readlink -f $0))"
$basedir/../filename {options} {parameters} &
readlink -f
将为您提供脚本的绝对路径,无论链接、工作目录等如何...
答案2
您可以在调用可执行文件之前尝试运行脚本,pwd
以查看脚本在运行第一个可执行文件后是否更改目录。
pwd
../filename {options} {parameters} &
pwd
../filename {options2} {parameters} &
pwd
../filename {options3} {parameters} &
pwd
../filename {options4} {parameters} &
答案3
听起来您需要知道的是脚本的当前位置,无论它是如何调用的(使用绝对路径、相对路径或通过 shell 的 $PATH)。一旦知道了这一点,您就可以通过相对于当前位置的路径引用其他可执行文件。
您可以使用以下命令获取正在运行的脚本的当前位置:
MYLOC=`dirname $0`
...然后使用此变量运行相对的可执行文件:
$MYLOC/../filename
无论当前工作目录如何(例如 $pwd),这都可以工作,甚至如果通过 shell 的 $PATH 找到并执行脚本,它也可以工作...因为,如果通过绝对或相对路径执行脚本,则 $0 具有关联的值...或者,如果通过搜索 shell 的 $PATH 来执行脚本,则 $0 包含脚本文件的绝对完整路径。
答案4
当您使用 时,您可能会更改当前工作目录../filename
。因此,最好在您的script_file.sh
以下几行中使用:
current_directory=$(pwd)
../filename {options} {parameters} &
cd $current_directory
../filename {options2} {parameters} &
cd $current_directory
../filename {options3} {parameters} &
cd $current_directory
../filename {options4} {parameters} &
这肯定会给你预期的结果。