[解決済み] bashでsshがwhileループから抜け出す [重複] [重複
2022-11-01 01:37:44
質問
私はこのbash-codeをリモートサーバにファイルをアップロードするために使用しています。
for i in `find devel/ -newer $UPLOAD_FILE`
do
echo "Upload:" $i
if [ -d $i ]
then
echo "Creating directory" $i
ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
continue
fi
if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i
then
echo "$i OK"
else
echo "$i NOK"
rm ${UPLOAD_FILE}_tmp
fi
done
ただ、名前にスペースが含まれるファイルについては、forループが失敗するので、1行目をこのように置き換えた。
find devel/ -newer $UPLOAD_FILE | while read i
do
echo "Upload:" $i
if [ -d $i ]
then
echo "Creating directory" $i
ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
continue
fi
if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i
then
echo "$i OK"
else
echo "$i NOK"
rm ${UPLOAD_FILE}_tmp
fi
done
何らかの奇妙な理由により、ssh-command は while ループから抜け出し、そのため最初の見つからないディレクトリはうまく作成されますが、それ以降のすべての見つからないファイル/ディレクトリは無視されます。
これは、ssh が標準出力に何かを書き、それが "read" コマンドを混乱させることと関係があるのだと思います。ssh コマンドをコメントアウトすると、ループが正常に動作するようになります。
なぜこのようなことが起こるのか、そしてどうすれば ssh が while ループを壊すのを防ぐことができるのか、誰かご存知でしょうか。
どのように解決するのですか?
問題点は
ssh
は標準入力から読み込むので、残りの行をすべて食ってしまうことです。その標準入力をどこにも接続しないようにすればよいのです。
ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i" < /dev/null
また
ssh -n
をリダイレクトの代わりに使うこともできます。
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bash prints リテラルの改行をエコーする \n
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] ssh "パーミッションが開きすぎています "エラー
-
[解決済み] Bashで文字列の配列をループする?
-
[解決済み】Bashでファイル名と拡張子を抽出する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] BashでWhileループが1行目で読み込みを停止する場合
-
[解決済み] bash に次の行に進むように指示する方法
-
[解決済み] Bashで引用符で囲まれた文字列の中で環境変数を使用する方法
-
[解決済み] Ansibleで新しいユーザーとパスワードを作成する
-
[解決済み] Bashでファイルを転置する効率的な方法
-
[解決済み] コマンドでファイルを使用し、出力を切り詰めることなく同じファイルにリダイレクトするにはどうすればよいですか?
-
[解決済み] 指定した名前のDockerコンテナが存在しない場合のみ、Bashコマンドを実行するにはどうすればよいですか?
-
[解決済み] bashでalt + numericを押すと(arg [numeric])と出ますが、これは何でしょう?
-
[解決済み] Unixで、カレントディレクトリ以下をすべて削除するにはどうしたらいいですか?
-
[解決済み] Bashの引数で引用符を維持するには?重複