これは人間の心で動作しますが、シェルは引用を無視します。
for h in a b; do ssh $h psql -tAc "select * from mytab where mycol='x'"; done
読みやすさを失うことなくこの行をどのように引用できますか?
答え1
引用符をエスケープする必要があります。パッケージ配信ゲームのパッケージレイヤーと考えてください。各シェルは「レイヤー」を開きます。
だから:
echo "this ; is a semicolon"
ただし、SSH経由で実行するには、次の手順を実行します。
ssh $user@$host echo "this ; is a semicolon"
これSSHパッケージの最初のレイヤーが開きます - 転送:
echo this ; is a semicolon
これはセミコロンがシェルによって解釈されるので中断されます。
したがって、これを行うには、最初に引用符をエスケープする必要があり、sshが1つのレイヤーを安全に「ロック解除」することができます。
ssh $user@$host echo "\"this ; is a semicolon\""
したがって、sshは「外部」と「エスケープレイヤー」を削除し、次のものを渡します。
echo "this ; is a semicolon"
これはライナーの1つに対して実行する必要があります。読みやすさを失わないことについては、エスケープや引用の入れ子が必然的に汚れているので、言葉のように簡単ではありません。
私が提供できる最善の方法は、変数を使用してSQL文をラップすることです。これにより、少なくとも「ラップされたドア」を送信することが明らかになります。
THING_TO_ECHO='"this ; is a semicolon"'; ssh $user@host echo $THING_TO_ECHO