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