我有一个名为 的脚本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)
?
答案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
两个脚本都驻留在同一目录中。您通常可以从$0
in的值派生该目录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 脚本中工作正常。