我有一个名为 的脚本Run_at_startup.sh
,其中包含以下行:
/bin/bash "$(pwd)/Testing_3.sh"
如果我手动运行Run_at_startup.sh
,Testing_3.sh
会正常运行。但是,如果Run_at_startup.sh
通过 运行crontab
,Testing_3.sh
则不会运行。显然,问题出在$(pwd)
. 那么,是否不可能$(pwd)
在通过运行的脚本中使用crontab
?如果是这样,可以用什么代替$(pwd)
?
如果要运行位于调用它的进程的当前工作目录中的脚本,只需使用
./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
,您将执行以下操作:或者:
如果你想从运行
that-script
并且another-script
两个脚本驻留在同一个目录中。您通常可以从 in 的值派生该$0
目录other-script
。例如,如果
other-script
是一个zsh
脚本:如果不是并且假设
$0
不以换行符结尾:的目录名
$0
可能是相对路径。要使其成为绝对路径,您可以在 zsh 中执行以下操作:其他贝壳:
pwd
返回当前目录。每次你这样做cd somedir
,结果都会pwd
改变。所以,如果
/bin/bash "$(pwd)/Testing_3.sh"
在启动时工作正常。做结果将是您需要在 crontab 中使用的字符串。
参考了Kusalananda贴出的链接后,找到了如下解决方案:
$(dirname "$0")在通过 crontab 运行的 bash 脚本中工作正常。