Su

為什麼 GNU su 不尊重選項的結束?

  • May 21, 2019

當我跑

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在我宣布選項結束後繼續搜尋選項。我錯過了什麼,這是一個錯誤還是只是可怕的設計?

-su: -z: invalid option
Usage:  -su [GNU long option] [option] ...
...

這是 Bash 的錯誤輸出,而不是 su 的錯誤輸出。如果您繼續引用,那麼下一行會提到一個腳本文件,例如,稍後會提到該--rcfile選項,這顯然不屬於su. 您還可以與 的輸出進行比較su -z,這將是一個不同的錯誤。

如果你跑

su -l -- root --version

您會看到參數被傳遞,並且報告其版本的是 Bash。

Bash 將自己報告為-su(注意),因為這是作為登錄 shell 呼叫它-時它的第零個參數中的內容,而不是因為它本身(甚至是)。su``su``-su


請注意,該su手冊實際上確實指出:

您可以使用該--參數將 su 選項與提供給 shell 的參數分開。

這就是這裡發生的事情:參數被傳遞給 shell。如果你遺漏--了,你會得到su錯誤輸出

su: invalid option -- 'z'
Usage: su [options] [LOGIN]
...

反而。

引用自:https://unix.stackexchange.com/questions/520060