我发现下面的一段代码是作为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变量也会重置吗?
答案 0 :(得分:8)
exec
本身(没有参数)不会启动新进程,但可以用来操作当前进程中的文件句柄。
这些行正在做的是:
$FILE
读取。 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中。