in
変数を入力ファイルを指すように設定していますが、何もしていません。 read
ビルトインは標準入力から読み込みます。これは継承されるため、いつでもリダイレクトされていなければ、呼び出すターミナル(または端末エミュレータ)シェルセッションに戻ります。
あなたは後から標準入力を復元したい場合は、あなたがそれを呼び出すよう、または
exec <"$in"
while read LINE
do
# ...
done
によって、あなたは未使用の記述にそれを保存する必要があります(ただし好むだろうどちらか、スクリプトの標準入力をリダイレクトすることができます次の代替、それは簡単ですと):
exec 3<&0 <"$in"
while read LINE
do
# ...
done
exec <&3 # to restore input
また、あなたが$in
から読み取るだけwhile
ループをリダイレクトすることができます
while read LINE
do
# ...
done <"$in"
さらなる代替は、あなたの入力にファイルディスクリプタを捧げ、そしてあなたのread
コマンドのためにそれを使用するread -u
を使用することです:あなたはin
に割り当てるときはさておき、注意するよう
exec 3<"$in"
while read -u 3 LINE
do
# ...
done <"$in"
exec 3<&- # to close the file neatly
各ということも
in="$1"
注:制御されていないユーザー入力から来た$1
の値を引用しますは、$file
を上書きするので、スクリプトの終了時に入力の最後の行だけが表示されます。 while
ループ全体の出力を、リダイレクトと同じ方法でリダイレクトすることを検討してください。例:
while read LINE
do
# ...
echo "$LINE" # Note the quoting (unless you actually intend to collapse whitespace)
done <"$in" >"$file" # and here!
どこから読んでいますか? – grail
あなたは '>'リダイレクトを使用しています。これは '$ LINE'という内容の新しいファイル' current_file.txt'を作成します。あなたのファイルに行を蓄積したい場合は、 '>'の代わりに '' ''を使います。 –
まあ、 'LINEを読んでいる間に' LINEを使うと、LINEは "in"の行を読みません。どこにあるのかは、テキストが入っているファイルの名前です –