it-swarm-ja.com

whileループを使用してファイルを読み取ると、途中でファイルの読み取りがランダムに停止します

次の形式の関数名のリストを含むファイル$ FUNCTION_FILEを読み取るコードの小さなセクションがあります。

func1
func2
func3

行を読み取り、関数を実行し、ファイルが完了するまで繰り返します。スニペットは次のとおりです。

while read line; do
    LINE_NUMBER=`expr $LINE_NUMBER + 1`
    echo "LINE_NUMBER=$LINE_NUMBER"

    $func
done <$FUNCTION_FILE

コードのこのセクションが終了する前に「$ FUNCTION_FILE」の読み取りを停止し、スクリプトの残りの部分に進むことがある状況に陥りました。最初の行だけを読み取って残りをスキップする場合もあれば、2行目だけを読み取る場合もあります。後続の行にも「LINE_NUMBER = $ LINE_NUMBER」メッセージが表示されません。

ファイルが正しいと仮定すると、私が見ているこの問題を引き起こす可能性のあるものは何ですか?

1
julian

関数のいずれかがstdinから読み取られますか(例:readコマンド)?もしそうなら、それは残りのFUNCTION_FILEを丸呑みにします。

別のファイル記述子を使用するようにwhileループを変更します。

line_num=0
while read -u3 line; do
    echo "LINE_NUMBER=$(( ++line_num ))"
    $func
done 3<"$function_file"

ALL_CAPS_VARIABLESを使用する習慣から抜け出します。ある日、誤って「PATH」を使用してスクリプトを壊してしまいます。

3
glenn jackman