帶有引用參數的程序列表,可移植
在不使用 proc 或任何其他非標準工具的情況下,如何獲取在命令行發出的原始命令?
使用 列印程序列表
ps
時,傳入啟動命令的參數顯示為不帶引號,這不是發出原始命令的方式。似乎也沒有任何ps
選項組合可以實現這一點。在搜尋了相當長的時間,甚至查看了很難找到的
ps
原始碼之後,沒有簡單的答案。目前還有其他文章提到了同樣的問題,但要麼沒有得到答复,要麼提出的解決方案不令人滿意。ps
可能可以編輯原始碼以獲得必要的結果,但這種方法不是首選,因為它ps
實際上是一個非標準包,對於它所在的每個作業系統都有顯著不同的編碼。例如,MacOS 上的原始碼與 ubuntu 上ps
的原始碼截然不同。ps
沒有可移植的方法來獲得另一個程序的命令行的明確表示。你沒有找到你正在尋找的答案,因為這是不可能的。您要麼需要處理模棱兩可的表示,要麼根據您的程式碼執行的作業系統使用不同的方法,或者找到為您完成這項工作的人。
POSIX 規範
ps
沒有具體說明該欄位args
的格式,只是它包含“帶有所有參數的命令作為字元串”並且它可以被截斷。在實踐中,我見過的所有實現都將參數與中間的空格連接起來。這是你可以用 POSIX 做的最好的事情。如果您想要一個程序的命令行參數的明確表示,您可以在 Linux 和其他具有類似 Solaris 的 proc 文件系統的 Unix 變體中找到它(而不是像 macOS 這樣的 BSD 系統)。參數由不能出現在參數中的空字節分隔,因此表示是明確的。我認為沒有辦法使用 Linux procps實用程序來獲取這些資訊,即使有,它也將是 Linux 特有的,因此它不會更便攜(事實上,便攜性較差,因為查看內部甚至可以在具有不同實用程序的 Linux 核心上,例如來自 BusyBox 的實用程序)。
/proc/*PID*/cmdline``ps``/proc``ps
我不知道如何在 macOS 上獲得命令行參數的明確表示。
我知道一個完成了不可移植部分的程序:Python 庫psutil。我可以確認它可以讓您獲得 Linux 上程序命令行的明確表示。它也應該適用於 macOS,因為文件沒有提到任何限制,但我還沒有測試過。
python3 -c 'import os, psutil; print(psutil.Process(os.getpid()).cmdline())'