为啥 echo "$0" 不在 bash 中打印脚本名称? [复制]

Posted

技术标签:

【中文标题】为啥 echo "$0" 不在 bash 中打印脚本名称? [复制]【英文标题】:Why isn't echo "$0" printing the script name in bash? [duplicate]为什么 echo "$0" 不在 bash 中打印脚本名称? [复制] 【发布时间】:2018-09-26 08:43:02 【问题描述】:

在学校我了解到“$0”将是 bash 中脚本的名称,但是当我尝试打印它时,它实际上打印的是 -bash 而不是脚本名。

#!/bin/bash
echo "$0"

输出:-bash

是我遗漏了什么,还是有其他命令可以获取脚本的名称?

【问题讨论】:

使用$BASH_SOURCE,而不是$0$0 通常不可靠,如BashFAQ #28 中所述。 【参考方案1】:

您正在从交互式外壳运行echo "$0",而不是从脚本。也许您将其放入脚本中,但随后获取了脚本而不是调用它?

$ cat > 1.sh
#!/bin/bash
echo "$0"
$ chmod u+x 1.sh
$ ./1.sh
./1.sh

但是

$ echo "$0"
bash
$ . ./1.sh
bash

【讨论】:

好的,谢谢。我试试看【参考方案2】:

使用$BASH_SOURCE,而不是$0,如BashFAQ #28 中所述——或者,更好的是,根本不依赖能够准确确定脚本的位置

$0 由调用者设置,可以是任意字符串——不保证与读取脚本的位置有任何关系。

为了证明这一点,请尝试运行(exec -a arbitrary-name ./your-script),它将执行your-script,并将$0 设置为arbitrary-name

当脚本为sourced 或从其他地方执行从文件读取的函数时,$0 未正确更新;而$BASH_SOURCE 在这些情况下更新。

本地文件名可能根本不存在:考虑使用ssh remotehost 'bash -s' <./scriptname 运行脚本的情况:没有与脚本源对应的本地文件名。

【讨论】:

以上是关于为啥 echo "$0" 不在 bash 中打印脚本名称? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

关于PHP中array_rand函数为啥不能只设置一个随机?

麻烦bat命令高手们,帮我看看,下面这段代码到底哪里有问题,为啥运行的时候,总提示echo 处于关闭状态

为啥 + 仅在客户端是 NaN?为啥不在 Node.js 中?

为啥我在DIV中输入文字不在DIV中

mysql自动排序为啥10在1后面不在9后面

ueditor编辑器上传附件是为啥不在编辑器内显示内容?也就无法获取路径保存在数据库中了,,,