如何创建并执行从更高文件夹调用可执行文件的 bash 脚本?

如何创建并执行从更高文件夹调用可执行文件的 bash 脚本?

我正在尝试编写一个非常简单的脚本,该脚本从更高级别的文件夹中调用可执行文件。如果我只是在控制台中输入命令,我会输入

../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} &

这肯定会给你预期的结果。

相关内容