Linux 新手,對命令列參數有一些疑問:
假設有一個名為 的命令列工具widget
,它接受一個名為 的參數fizz
。我見過所有不同類型的論點:
widget -fizz
widget --fizz
widget \fizz
widget -f
它們的使用方式有什麼不同?命令列工具是否決定如何以不同的方式確定它們,或者 Linux 是否知道它們都具有相同的含義,但以不同的方式將它們提供給應用程式?
我可以自訂自己的方式來傳遞(已經存在的)widget
工具的fizz
參數嗎:
widget #f#
先致謝!
答案1
它們的使用方式有什麼不同?
這完全取決於程序,因為......
命令列工具是否決定如何以不同的方式確定它們,或者 Linux 是否知道它們都具有相同的含義,但以不同的方式將它們提供給應用程式?
...該過程的參數以單一字串的陣列形式出現。
這裡牽涉到兩個東西:一是shell,它解析你輸入的輸入並執行行程。例如,在空格上分割字串並將其傳遞給widget
.例如,請參閱man sh
和man bash
了解有關他們如何處理這些事情的詳細資訊。
不過,最終會以字串的形式widget
取得參數-fizz
或完全按照其編寫的方式取得參數。--fizz
它決定如何處理它。
有一些標準 -getopts
和的許多變體popt
處理這些參數widget
,並且它們具有某種程度的“標準”行為。
儘管如此,沒有什麼可以阻止作者widget
發明自己的標準。
因此,最後,如果您是原始程式碼的作者widget
或以其他方式修改原始程式碼,您絕對可以將其視為#f#
參數fizz
。但是,如果不更改程序,您就無法做到這一點。
答案2
命令列工具是否決定如何以不同的方式確定它們,或者 Linux 是否知道它們都具有相同的含義,但以不同的方式將它們提供給應用程式?
可執行檔或函數的工作是評估其參數。 shell(不是 Linux,而是bash
、csh
等)根本不會幹擾這些參數。
這意味著在您的案例中,每個論點都會受到不同的對待。但請注意,shell 執行擴充或者替換在命令獲取其參數之前。例如,當您有一個包含兩個 JPG 圖像的資料夾時,並寫入:
ls *.jpg
然後 shell 將擴展*.jpg
為image1.jpg image2.jpg
,因此導致ls
傳遞以下參數:
ls image1.jpg image2.jpg
除此之外,除了重寫原始程式碼之外,您無法真正修改腳本以採用已編譯或寫入執行檔中的參數之外的其他參數。
另請檢查以下問題:
答案3
首先,您不太可能\
在 Linux 中看到任何以 開頭的參數,因為在大多數 shell 中,這是一個轉義字符,用於轉義空格和其他對 shell 有意義的字符($
、""
、()
等)。
Linux shell(大多數發行版中的 Bash)僅將每個以空格分隔的參數作為字串傳遞給進程。進程決定如何處理它們是程式設計師的選擇。
通常-
前綴表示短選項(如-h
),--
表示較長版本(如--help
)。這是大多數 Linux 程式使用的 POSIX 標準的一部分,該標準繼承自早期的 Unix 工具。請參閱獲取選擇維基百科上的文章以獲取更多資訊。
對於你的最後一個問題,不,你不能修改工具widget
解釋這些參數的方式,除非你修改它的原始碼。
在某些 Unix 系統上有一個漂亮的實用程序,稱為帕爾格斯這可以讓您看到傳遞給進程的所有參數。在 Linux 中,您可以使用以下命令複製此內容
ps eww -p 12345
其中 12345 是進程識別碼 (PID)。看這個答案作為替代方案。