アップデート

アップデート

こんにちは。

ssh [email protected]  "bash -lc 'pm2 list | grep app | awk { print $3} '"

ここに貼り付けたコマンドを実行する必要があります。問題は、すでに 2 回エスケープしていることです... bash では"、pm2 では です'。awk をエスケープするにはどうすればよいでしょうか?

awk '{ print $3 }' でエスケープすれば機能することはわかっていますが、all コマンドはすでに 2 回エスケープされています... では、どうすればいいのでしょうか?

アップデート

次の bash コマンドを作成しました:

PM2_APP_ID=`$REMOTE_SRV_SSH_COMMAND "bash -lc \"pm2 list | grep app | grep -v 'pm2 show' | awk '{ print \\\$4 }'\""`;

ここでは、pm2 リストの関連行がすべて表示されます。awk が実行されたことがないようです。

答え1

一重引用符で囲まれた文字列内の一重引用符をバックスラッシュでエスケープすることはできませんが、二重引用符で囲まれた文字列内の二重引用符はバックスラッシュでエスケープできます。つまり、次のようにすることができます。

ssh [email protected]  "bash -lc \"pm2 list | grep app | awk '{ print \\\$3 }'\""

$3 が最初にローカル シェルによって、次にリモート シェルによって展開されるのを避けるために、awk プログラムで $ を 2 回エスケープする必要があります。

答え2

コメントをくださった @dave_thompson_085 さんに感謝します。おかげで問題は解決しました。

次のコマンドを使用しています:

PM2_APP_ID=`$REMOTE_SRV_SSH_COMMAND "bash -lc 'pm2 list'" | grep app | grep -v 'pm2 show' | awk '{ print $4 }'`;

ご覧のとおり、私はリモート サーバーで pm2 リストを使用し、残りはローカルで実行しています。エスケープ処理に手間がかからず、適切に動作します。

関連情報