Ps

如何顯示引用的命令列表?

  • February 11, 2020

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 

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