Bash $ 0与终端

时间:2018-05-10 18:08:36

标签: bash args

在bash脚本中我已经尝试向用户打印一些信息(以响应特定错误),表明他们在命令中添加了一个开关。我以为$0总是包含用户在终端上键入的文本,所以我的bash看起来像这样:echo "try '$0 -s $@' instead."

我发现当我从相对路径调用该脚本时,例如./script.sh,$0正如我所期望的那样"./script.sh"。但是,如果script.sh位于我的PATH中并且我使用script.sh调用它,则$0 "script.sh"。它最终成为脚本文件的绝对路径。

我可以使用basename $0来纠正第二种情况,但这会弄乱第一种情况。有没有办法找出用户为启动脚本文件的命令输入的确切文本?

1 个答案:

答案 0 :(得分:4)

不,您通常无法找到用户键入的内容。

用户可以:

  • 输入一个函数或包装器,它会运行您和其他命令,并且可能无法传递参数。
  • 在高度非Bourne shell中输入内容,例如Shelly' run_ "./script" ["--foo"]
  • 点击桌面菜单,而不是输入内容。
  • 从Android TV上运行的Java代码段中的不可重复的流中执行脚本。

规范行为是让调用者将argv[0]设置为"与正在启动的进程相关联的文件名字符串" (POSIX),无论它意味着什么,并且让你在sh中回复它们 - 就像使用说明一样。

不幸的是,对于脚本,调用者的argv[0]在间接到shebang解释器时会丢失,而后者最终会将$0设置为它解释的文件名参数。< / p>

但它仍然很好。重要的是,您可以使用basename "$0""$0"标识自己,并指出参数错误的原因。用户有责任将更改纳入其特定的工作流程。