【发布时间】:2018-09-26 08:43:02
【问题描述】:
在学校我了解到“$0”将是 bash 中脚本的名称,但是当我尝试打印它时,它实际上打印的是 -bash 而不是脚本名。
#!/bin/bash
echo "$0"
输出:-bash
是我遗漏了什么,还是有其他命令可以获取脚本的名称?
【问题讨论】:
-
使用
$BASH_SOURCE,而不是$0。$0通常不可靠,如BashFAQ #28 中所述。
在学校我了解到“$0”将是 bash 中脚本的名称,但是当我尝试打印它时,它实际上打印的是 -bash 而不是脚本名。
#!/bin/bash
echo "$0"
输出:-bash
是我遗漏了什么,还是有其他命令可以获取脚本的名称?
【问题讨论】:
$BASH_SOURCE,而不是$0。 $0 通常不可靠,如BashFAQ #28 中所述。
您正在从交互式外壳运行echo "$0",而不是从脚本。也许您将其放入脚本中,但随后获取了脚本而不是调用它?
$ cat > 1.sh
#!/bin/bash
echo "$0"
$ chmod u+x 1.sh
$ ./1.sh
./1.sh
但是
$ echo "$0"
bash
$ . ./1.sh
bash
【讨论】:
使用$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 运行脚本的情况:没有与脚本源对应的本地文件名。
【讨论】: