Bash 命令和选项顺序

Bash 命令和选项顺序

当我发出:

bash -l -c "./test"

子 shell 确实作为登录 shell 运行,但在某些情况下:

bash -c "./test1" -l

父 shell(我正在运行命令的 shell)似乎忽略了-l选项,并且子 shell 没有作为登录 shell 运行。

如果我是对的,原因是命令选项的顺序bash是相关的,在这种情况下-l选项必须位于之前-c。我是对的吗?

答案1

是的,你说得对。来自man bash

-c string
如果-c存在选项,则从 读取命令string。如果 之后有参数string,则将它们分配给位置参数,从 开始$0

这意味着bash -c 'echo $0' -l返回-l

答案2

Unix 命令的惯例是文件名放在最后(因为许多命令可以使用几乎无限数量的文件名)。换句话说,第一个看起来不像标志/选项的东西被解释为文件名[1],其后的所有内容也是如此。

[1] 如果你使用以破折号开头的文件,则可以通过两种方式消除歧义:

  • 使用./-foo而不是-foorm ./-foobar
  • 在真实选项的末尾使用“--”,因为许多命令将其解释为选项的结尾和文件名的开头: rm -- -foobar。良好的脚本编码实践建议--在文件名未预先确定的命令中使用“围栏”。

相关内容