如何执行与当前脚本位于同一目录的脚本?

如何执行与当前脚本位于同一目录的脚本?

为什么 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_scriptDIR将被设置为 //,并将"$DIR"/script.sh被扩展为 ///script.sh,即保证相当于/script.sh.如果 $0是更常见的东西,例如/foo/bin/first_scriptDIR则将被设置为 /foo/bin/,并将"$DIR"/script.sh扩展为 /foo/bin//script.sh,这也是保证相当于/foo/bin/script.sh.

答案4

改进答案米凯尔·凯尔

我在处理带有空格的路径时遇到问题,但能够使用以下方法解决它

cd "$(dirname "$0")"

相关内容