この質問は少し複雑です。詳しく説明しようと思います。
2台のコンピュータがあり、1つはローカルで、もう1つは192.168.1.2
ローカルコンピュータに次の変数を設定しました。
CHECK="/home/test/Desktop/"
test
私のローカルコンピュータとリモートコンピュータの両方に名前が付けられたユーザーが存在します。 SSH経由でローカルで次のコマンドを実行したいと思います。
ssh -n [email protected] "until [ `cat $CHECK/samplefile | grep "string"` ]; do touch $CHECK/success; done"
私が達成したいのは、リモートシステムの$ CHECK / samplefileに "string"というエントリがあることを確認したいということです。見つかったら、until
ループを終了して続行したいと思います。ただし、このコマンドを実行すると、次のエラーメッセージが表示されます。
cat: /home/test/Desktop//samplefile: No such file or directory
test
しかし、私のリモートコンピュータには、ユーザーデスクトップのファイル名がサンプルファイルとして含まれていると確信しています。さらなる調査の後、until
バックティックに提供された条件文が実際にlocal
代わりに実行されることがわかりましたremote
(私のローカルデスクトップにはそのようなファイルはありません)。さらに、Untilループの残りのコマンドは正常に機能し、リモートコンピュータのデスクトップにSuccessという新しいファイルが作成されます。
問題がバックティックにあるかどうかはわかりません。過去3時間の間、この問題できつくできませんでした。どんな提案がありますか?
ベストアンサー1
あなたの質問が示すように、この代替品は次のとおりです。
`cat $CHECK/samplefile | grep "string"`
ローカルコンピュータで実行されます。次の方法で簡単に修正できます。
ssh -n [email protected] \
"until { cat ""$CHECK""/samplefile | grep ""string""; }; do \
touch ""$CHECK""/success; \
done"
ご覧のとおり、変数を解析する以外に置換は必要ありません$CHECK
。条件付き命令を{...}
リストに入れることができ、リストの終了コードがuntil
命令に対して決定されます。