在bash脚本中我已经尝试向用户打印一些信息(以响应特定错误),表明他们在命令中添加了一个开关。我以为$0
总是包含用户在终端上键入的文本,所以我的bash看起来像这样:echo "try '$0 -s $@' instead."
我发现当我从相对路径调用该脚本时,例如./script.sh,$0
正如我所期望的那样"./script.sh"
。但是,如果script.sh位于我的PATH中并且我使用script.sh
调用它,则$0
不 "script.sh"
。它最终成为脚本文件的绝对路径。
我可以使用basename $0
来纠正第二种情况,但这会弄乱第一种情况。有没有办法找出用户为启动脚本文件的命令输入的确切文本?
答案 0 :(得分:4)
不,您通常无法找到用户键入的内容。
用户可以:
run_ "./script" ["--foo"]
。规范行为是让调用者将argv[0]
设置为"与正在启动的进程相关联的文件名字符串" (POSIX),无论它意味着什么,并且让你在sh
中回复它们 - 就像使用说明一样。
不幸的是,对于脚本,调用者的argv[0]
在间接到shebang解释器时会丢失,而后者最终会将$0
设置为它解释的文件名参数。< / p>
但它仍然很好。重要的是,您可以使用basename "$0"
或"$0"
标识自己,并指出参数错误的原因。用户有责任将更改纳入其特定的工作流程。