为什么 GNU `su` 不尊重选项结束?

为什么 GNU `su` 不尊重选项结束?

当我跑步时

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]
...

反而。

相关内容