如何在通过 crontab 运行的 bash 脚本中使用 $(pwd)?

如何在通过 crontab 运行的 bash 脚本中使用 $(pwd)?

我有一个名为 的脚本Run_at_startup.sh,其中包含以下行:

/bin/bash "$(pwd)/Testing_3.sh"

如果我手动运行Run_at_startup.shTesting_3.sh将正常运行。但是,如果Run_at_startup.sh通过 运行crontabTesting_3.sh则不会运行。显然,问题就出在$(pwd)。那么,是否无法$(pwd)在通过 运行的脚本中使用crontab?如果可以的话,可以用什么来代替$(pwd)

答案1

如果您想运行位于调用它的进程的当前工作目录中的脚本,只需使用./that-script.

"$(pwd)/that-script"在类 POSIX shell 中(并且cron应该调用类 POSIX shell 来解析命令行)是"$PWD/that-script".较差,因为它必须运行额外的过程,而且还因为$(...)剥离全部$PWD尾随换行符,因此如果存储的当前工作目录的路径以换行符结尾,它将不起作用。

./that-script"$PWD/that-script"(将展开为)的区别/path/to/working/directory/that-script在于前者是相对路径,后者是绝对路径。在任何一种情况下,如果在调用解析该命令that-script行的 shell 进程的当前工作目录中找不到,则会失败。cron

默认情况下,您的作业crontab通常在您的主目录中启动。

如果that-script不在该目录中,您将使用/actual/path/to/that-script.如果脚本以其当前工作目录运行也很重要/actual/path/to,那么您可以这样做:

cd /actual/path/to && ./that-script

或者:

cd /actual/path/to && "$PWD/that-script"

如果您想运行that-script并且another-script两个脚本都驻留在同一目录中。您通常可以从$0in的值派生该目录other-script

例如,如果other-script是一个zsh脚本:

bash -- $0:h/that-script

如果不是并且假设$0不以换行符结尾:

bash -- "$(dirname -- "$0")/that-script"

的目录名$0可以是相对路径。要使其成为绝对路径,您可以在 zsh 中执行以下操作:

bash -- $0:P:h/that-script

其他外壳:

dir=$(CDPATH= cd -P -- "$(dirname -- "$0")" && pwd -P) || exit
bash -- "$dir/that-script"

答案2

pwd返回当前目录。每次你这样做cd somedir,结果都会pwd改变。

所以,如果/bin/bash "$(pwd)/Testing_3.sh"启动时工作正常。做

echo "$(pwd)/Testing_3.sh"

结果将是您需要在 crontab 中使用的字符串。

答案3

在参考Kusalananda发布的链接后,我找到了以下解决方案:

/bin/bash "$(dirname "$0")/Testing_3.sh"

$(目录名“$0”)在通过 crontab 运行的 bash 脚本中工作正常。

相关内容