为什么 shell 脚本这么难开发?在 NodeJS 中我可以简单地执行以下操作:
require('./script')
并且它总是需要script
相对于当前脚本。但如果我在 shell/bash 中尝试:
./script.sh
它将查找与cwd
( pwd
) 相关的脚本。似乎点表示cwd
( pwd
) 而不是我所期望的当前脚本所在的目录。
line 8: ./script.sh: No such file or directory
如何相对于当前执行脚本所在目录执行脚本?
我努力了
/bin/bash script.sh
但我收到错误:
/bin/bash: script.sh: No such file or directory
然后我尝试了
script.sh
出现此错误
line 8: script.sh: command not found
只有以下解决方案工作正常,但问题是它不可读:
$("$(dirname "$(realpath "$0")")/script.sh")
答案1
获取脚本目录的另一种变体:
DIR="$(cd "$(dirname "$0")" && pwd)"
然后你可以调用脚本
$DIR/script.sh
答案2
不幸的是,这就是要走的路。
另一种方法(我更喜欢)是在脚本开头 cd 到当前目录,如下所示:
cd $(dirname $0)
答案3
正如其他答案所示,您的解决方案是正确的。
正如其他答案所建议的,您可以获取脚本目录一次并多次使用它。这可能更清洁、更高效。
正如其他答案所建议的,您可能不需要
realpath
.您能说出为什么您认为您需要它吗?您的解决方案中似乎有一个额外的
$(
和。)
"$(dirname "$(realpath "$0")")/script.sh"
应该足够了……
......除了有一个非常微妙的极端情况,没有其他人指出。让我们同质化其他答案:
DIR="$(dirname "$(realpath "$0")")" "$DIR"/script.sh
如果“当前脚本”位于根目录中(例如,它是
/first_script
),并且假设realpath
没有任何效果,我们将得到DIR="/"
,因此"$DIR"/script.sh
线将扩展为
"/"/script.sh
IE,
//script.sh
这通常相当于
/script.sh
.但 Unix (POSIX) 保留处理的权利//
一开始特别是路径名。这样做是无限安全的DIR="$(dirname "$(realpath "$0")")"/ "$DIR"/script.sh
/
在 的定义末尾带有(额外的、显式的)DIR
。如果$0
是/first_script
,DIR
将被设置为//
,并将"$DIR"/script.sh
被扩展为///script.sh
,即保证相当于/script.sh
.如果$0
是更常见的东西,例如/foo/bin/first_script
,DIR
则将被设置为/foo/bin/
,并将"$DIR"/script.sh
扩展为/foo/bin//script.sh
,这也是保证相当于/foo/bin/script.sh
.