关于linux:为什么不用echo“$ 0”在bash中打印脚本名称?

Why isn't echo “$0” printing the script name in bash?

本问题已经有最佳答案,请猛点这里访问。

在学校,我知道"0美元"是bash中脚本的名称,但当我尝试打印它时,它实际上是打印-bash而不是脚本名。

1
2
#!/bin/bash
echo"$0"

输出:-BASH

是否有我遗漏的内容,或者是否有其他命令来获取脚本的名称?


您从交互shell运行echo"$0",而不是从脚本运行。也许你把它放进了一个脚本中,但随后源代码是脚本而不是调用它?

1
2
3
4
5
6
$ cat > 1.sh
#!/bin/bash
echo"$0"
$ chmod u+x 1.sh
$ ./1.sh
./1.sh

但是

1
2
3
4
$ echo"$0"
bash
$ . ./1.sh
bash


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

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

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

  • 当脚本是sourced,或者从文件中读取的函数是从其他地方执行时,$0不会得到适当的更新;而在这些情况下,$BASH_SOURCE是更新的。

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