当我跑步时
user@hostname:~$ su -- root -z
我明白了
bash: -z: invalid option
Usage: bash [GNU long option] [option] ...
...
以上是我期望的行为。
当我跑步时
user@hostname:~$ su -l -- root -z
我明白了
-su: -z: invalid option
Usage: -su [GNU long option] [option] ...
...
我使用无效选项-z
只是为了演示哪个命令正在解析该选项。
这种行为让我烦恼不已。su
在我声明选项结束后继续搜索选项。我错过了什么吗,这是一个错误还是只是可怕的设计?
答案1
-su: -z: invalid option Usage: -su [GNU long option] [option] ... ...
这是 Bash 的错误输出,而不是 su 的错误输出。如果您继续引用,那么下一行会提到一个脚本文件,例如,后面的选项--rcfile
,它显然不属于su
.您还可以与 的输出进行比较su -z
,这将是不同的错误。
如果你跑
su -l -- root --version
你会看到参数被传递,并且 Bash 报告了它的版本。
Bash 将其自身报告为-su
(注意-
),因为这是在su
将其作为登录 shell 调用时其第 0 个参数中的内容,而不是因为它su
本身(甚至是-su
)。
请注意,su
手册确实指出:
您可以使用
--
参数将 su 选项与提供给 shell 的参数分开。
这就是这里发生的情况:参数被传递到 shell。如果你遗漏了--
,你会得到su
错误输出
su: invalid option -- 'z'
Usage: su [options] [LOGIN]
...
反而。