为啥 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
。
当脚本为source
d 或从其他地方执行从文件读取的函数时,$0
未正确更新;而$BASH_SOURCE
已在这些情况下更新。
本地文件名可能根本不存在:考虑使用ssh remotehost 'bash -s' <./scriptname
运行脚本的情况:没有与脚本源对应的本地文件名。
【讨论】:
以上是关于为啥 echo "$0" 不在 bash 中打印脚本名称? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
关于PHP中array_rand函数为啥不能只设置一个随机?
麻烦bat命令高手们,帮我看看,下面这段代码到底哪里有问题,为啥运行的时候,总提示echo 处于关闭状态