2011-01-11 10 views
3

ファイルから行ごとに読み込むシェルスクリプトとして書かれたコードの一部が見つかりました。ファイルからの読み取り中にexecコマンドの重要性

BAKIFS=$IFS 
IFS=$(echo -en "\n\b") 
exec 3<&0 
exec 0<"$FILE" 
while read -r line 
do 
# use $line variable to process line in processLine() function 
processLine $line 
done 
exec 0<&3 

# restore $IFS which was used to determine what the field separators are 
IFS=$BAKIFS 

3つのexecコマンドの必要性を理解できません。誰かが私のためにそれを精巧にすることはできますか?また、ファイルからの1回の読み込みのたびに$ ifs変数がリセットされますか?

答えて

8

exec(引数なし)は新しいプロセスを開始しませんが、現在のプロセスでファイルハンドルを操作するために使用できます。

何これらの行がやっていることは次のとおりです。

  • 一時的に$FILEから読み取るための標準入力を修正3.
  • にファイルハンドルに現在の標準入力(ファイルハンドル0)を保存します。
  • 読み取りを行います。
  • 標準入力を元の値に戻します(ファイルハンドル3から)。

IFSは、whileループの期間"\n\b"として留まり、(以前保存)IFS=$BAKIFSと元の値にリセットされ、すべてのread後にリセットされません。具体的には


:示されているコードは同等です

BAKIFS=$IFS     # save current input field separator 
IFS=$(echo -en "\n\b")   # and change it. 

exec 3<&0      # save current stdin 
exec 0<"$FILE"     # and change it to read from file. 

while read -r line ; do  # read every line from stdin (currently file). 
    processLine $line   # and process it. 
done 

exec 0<&3      # restore previous stdin. 
IFS=$BAKIFS     # and IFS. 
+0

ありがとうございます。私は、このスクリプトをバックグラウンドでサーバー上で実行すると仮定します。whileループの期間中、標準入力は3に設定されます。これは、標準入力を使用できないことを意味しますかその期間の他のプログラムを読むには?この依存関係を削除するための任意のアイデア? – ayush

+1

そのファイルハンドルは_process_に属し、システム全体のリソースではありません。たとえば、すべてのプロセスは、他のプロセスと競合することなく、独自の標準入力(ファイルハンドル0)を取得します。だから、もしあなたがそれとは別のプログラムを実行しているのであれば、いいえ。もちろん、プロセスの中では、whileループ内の "実際の" stdinから別の行を読み込むことはできません(たとえば、ファイルの次の行を取得するため)。 – paxdiablo

+0

もう一度ありがとう...今私はそれを得た。 – ayush

0

:そのようなシェルで

IFS=$'\n' 

:ところで

while read -r line 
do 
    ... 
done < "$FILE" 

、あなたはこれを行うことができますそれをサポートするBashとして。

関連する問題