从文件读取时exec命令的重要性

时间:2011-01-11 06:08:19

标签: shell

我发现下面的一段代码是作为shell脚本编写的,用于逐行读取文件。

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

我无法理解提到的三个exec命令的必要性。有人可以为我详细说明。每次从文件读取后,$ ifs变量也会重置吗?

2 个答案:

答案 0 :(得分:8)

exec本身(没有参数)不会启动新进程,但可以用来操作当前进程中的文件句柄。

这些行正在做的是:

  • 暂时将当前标准输入(文件句柄0)保存到文件句柄3中。
  • 修改标准输入以从$FILE读取。
  • 读书。
  • 将标准输入设置回原始值(来自文件句柄3)。

IFS未在read之后重置,在"\n\b"循环的持续时间内保持为while,并在IFS=$BAKIFS时重置为原始值(先前保存过)。


详细说明:

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.

答案 1 :(得分:0)

显示的代码相当于:

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

顺便说一句,你可以这样做:

IFS=$'\n'

在支持它的Bash之类的shell中。