【问题标题】: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 中所述。

标签: linux bash


【解决方案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 运行脚本的情况:没有与脚本源对应的本地文件名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多