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

Har*_*her 0 su gnu

当我跑

user@hostname:~$ su -- root -z
Run Code Online (Sandbox Code Playgroud)

我得到

bash: -z: invalid option
Usage:  bash [GNU long option] [option] ...
...
Run Code Online (Sandbox Code Playgroud)

以上是我期望的行为。

当我跑

user@hostname:~$ su -l -- root -z
Run Code Online (Sandbox Code Playgroud)

我得到

-su: -z: invalid option
Usage:  -su [GNU long option] [option] ...
...
Run Code Online (Sandbox Code Playgroud)

我使用 invalid 选项-z只是为了演示哪个命令正在解析该选项。

这种行为让我感到厌烦。su在我宣布选项结束后继续寻找选项。我错过了什么,这是一个错误还是可怕的设计?

Mic*_*mer 6

-su: -z: invalid option
Usage:  -su [GNU long option] [option] ...
...
Run Code Online (Sandbox Code Playgroud)

这是 Bash 的错误输出,而不是 su。如果你继续引用,下一行会提到一个脚本文件,例如,后面提到的--rcfile选项,显然不属于su. 您还可以与 的输出进行比较su -z,这将是一个不同的错误。

如果你跑

su -l -- root --version
Run Code Online (Sandbox Code Playgroud)

你会看到参数被传递了,它是 Bash 报告它的版本。

Bash 将自己报告为-su(注意-),因为这是在将其su作为登录 shell 调用时的第零个参数中的内容,而不是因为它su本身(甚至是-su)。


请注意,su手册确实指出:

您可以使用--参数将 su 选项与提供给 shell的参数分开。

这就是这里发生的事情:参数传递给 shell。如果你离开--了,你会得到su错误输出

su: invalid option -- 'z'
Usage: su [options] [LOGIN]
...
Run Code Online (Sandbox Code Playgroud)

反而。