如何确定脚本本身中的Bash脚本文件的名称?

就像如果我的脚本在文件runme.sh中,那么我如何让它显示“您正在运行runme.sh”消息而不硬编码?


当前回答

如果脚本名中有空格,更可靠的方法是使用"$0"或"$(basename "$0")"-或MacOS: "$(basename \"$0\")"。这可以防止名称以任何方式被破坏或解释。一般来说,在shell中始终使用双引号作为变量名是一种良好的实践。

其他回答

DIRECTORY=$(cd `dirname $0` && pwd)

我从另一个堆栈溢出问题得到了上面,Bash脚本可以告诉它存储在什么目录中吗?,但我认为它对这个话题也很有用。

this="$(dirname "$(realpath "$BASH_SOURCE")")"

这将解析符号链接(realpath会这样做),处理空格(双引号会这样做),并将找到当前脚本名称,即使是在来源(. ./myscript)或被其他脚本调用时($BASH_SOURCE会这样做)。在所有这些之后,最好将其保存在环境变量中以便重用或方便复制到其他地方(this=)…

为了回答Chris Conway的问题,在Linux上(至少)你会这样做:

echo $(basename $(readlink -nf $0))

Readlink输出符号链接的值。如果不是符号链接,则打印文件名。-n告诉它不打印换行符。-f告诉它完全跟随链接(如果一个符号链接是到另一个链接的链接,它也会解析那个链接)。

回复:上面Tanktalus(接受)的答案,一个稍微干净一点的方法是使用:

me=$(readlink --canonicalize --no-newline $0)

如果你的脚本来自另一个bash脚本,你可以使用:

me=$(readlink --canonicalize --no-newline $BASH_SOURCE)

我同意,如果您的目标是向用户提供反馈,那么取消对符号链接的引用可能会令人困惑,但在某些情况下,您确实需要获得脚本或其他文件的规范名称,在我看来,这是最好的方法。

$0将给出您正在运行的脚本的名称。创建一个脚本文件并添加以下代码

#!/bin/bash
echo "Name of the file is $0"

然后像这样从终端运行

./file_name.sh