Ps
如何顯示引用的命令列表?
ps -o command
在單獨的行上顯示每個命令,用空格分隔,不帶引號的參數:$ ps -o command COMMAND bash ps -o command
在檢查引用是否正確或複制並粘貼命令以再次執行它時,這可能是一個問題。例如:
$ xss-lock --notifier="notify-send -- 'foo bar'" slock & [1] 20172 $ ps -o command | grep [x]ss-lock xss-lock --notifier=notify-send -- 'foo bar' slock
的輸出具有
ps
誤導性 - 如果您嘗試複製和粘貼它,該命令將不會執行與原始命令相同的操作。那麼有沒有一種類似於 Bash 的方法printf %q
來列印帶有正確轉義或引用的參數的正在執行的命令列表?
/proc/$pid/cmdline
在 Linux 上,對於給定的程序 ID ,您可以從命令中獲取稍微更原始的 args 列表。args 由 nul 字元分隔。嘗試cat -v /proc/$pid/cmdline
將 nuls 視為^@
,在您的情況下:xss-lock^@--notifier=notify-send -- 'foo bar'^@slock^@
。以下 perl 腳本可以讀取 proc 文件並將 nuls 替換為換行符和製表符,為您的範例提供:
xss-lock --notifier=notify-send -- 'foo bar' slock
或者,您可以像這樣獲得重新引用的命令:
xss-lock '--notifier=notify-send -- '\''foo bar'\''' 'slock'
如果您將 by 替換
if(1)
為if(0)
:perl -e ' $_ = <STDIN>; if(1){ s/\000/\n\t/g; s/\t$//; # remove last added tab }else{ s/'\''/'\''\\'\'\''/g; # escape all single quotes s/\000/ '\''/; # do first nul s/(.*)\000/\1'\''/; # do last nul s/\000/'"' '"'/g; # all other nuls } print "$_\n"; ' </proc/$pid/cmdline