追加読書

追加読書

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あります。コピーして貼り付けようとすると、コマンドは元のコマンドと同じ操作を実行しません。だからprintf %q実行中のコマンドのリストを印刷するBashと同じ方法はありますか?パラメーターを正しくエスケープまたは引用してください。

ベストアンサー1

/proc/$pid/cmdlineLinux では、プロセス ID が指定されたコマンドから少しより原始的な引数のリストを取得できます。 args は null 文字で区切られます。あなたの場合は、cat -v /proc/$pid/cmdline次のようにnulを処理してみてください。^@xss-lock^@--notifier=notify-send -- 'foo bar'^@slock^@

次のPerlスクリプトはprocファイルを読み込み、nulを改行とタブに置き換えることができます。たとえば、次のようになります。

xss-lock
    --notifier=notify-send -- 'foo bar'
    slock

または、次のように再引用したコマンドを取得することもできます。

xss-lock '--notifier=notify-send -- '\''foo bar'\''' 'slock' 

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 

おすすめ記事