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