1. ホーム
  2. bash

[解決済み] BashでWhileループが1行目で読み込みを停止する場合

2022-07-03 20:29:10

質問

次のようなシェルスクリプトがあります。目的は、ターゲット ファイル (そのパスはスクリプトへの入力パラメータです) の各行をループして、各行に対して作業を行うことです。現在、ターゲットファイルの最初の行に対してのみ動作し、その行が処理された後に停止しているようです。私のスクリプトに何か問題があるのでしょうか?

#!/bin/bash
# SCRIPT: do.sh
# PURPOSE: loop thru the targets 

FILENAME=$1
count=0

echo "proceed with $FILENAME"

while read LINE; do
   let count++
   echo "$count $LINE"
   sh ./do_work.sh $LINE
done < $FILENAME

echo "\ntotal $count targets"

do_work.sh では、いくつかの ssh コマンドを実行します。

どのように解決するのですか?

問題点は do_work.sh が実行される ssh コマンドを実行し、デフォルトでは ssh は入力ファイルである stdin から読み込みます。その結果、コマンドはファイルの残りを消費して while ループが終了するため、処理された最初の行だけが表示されます。

この現象は ssh だけでなく、stdin を読み取るすべてのコマンド、たとえば mplayer , ffmpeg , HandBrakeCLI などなど。

これを防ぐには -n オプションを ssh コマンドから読み込むようにします。 /dev/null から読み込むようにします。他のコマンドにも同様のフラグがありますし、普遍的に < /dev/null .