Unix在文件输入重定向中读取命令行为

时间:2014-02-07 07:26:47

标签: shell unix

考虑我有一个包含内容的文件

cat file | read; echo $REPLY

给出空输出

read < file; echo $REPLY

将文件的第一行作为结果

while IFS= read; do :; done < file; echo $REPLY

什么都不打印,空输出。我在这里期望文件的最后一行作为输出,因为我认为迭代将在文件结束时发生,最后一行将保留在 REPLY 变量中。出现这种行为的原因是什么?

2 个答案:

答案 0 :(得分:1)

while IFS= read; do :; done < file; echo $REPLY

上面逐个读取文件的每一行。在读取文件的最后一行后,它会循环播放,然后再次尝试读取。这是最后一次尝试读取生成文件结束条件和空$ REPLY。

read < file; echo $REPLY

默认情况下,read一次读取一行。你只要求一行,这就是$ REPLY中的内容。 (如果指定-d的{​​{1}}选项,则$ REPLY可以将整个文件包含在其中,具体取决于所选的分隔符。

read

这是一个管道。这意味着cat file | read; echo $REPLY 位于子shell中。因此,它创建的shell变量无法生存。

如果您的目标是将文件的最后一行放入变量,那么有一些选项。例如:

read

或者,

reply="$(tail -n1 file)" ; echo $reply

(在sed-speak中,reply="$(sed -n '$p' file )" ; echo $reply 表示文件的最后一行,$表示打印。因此,p表示打印文件的最后一行。)

答案 1 :(得分:0)

如果您想使用REPLY保留while loop变量中文件的最后一行,请使用此代码:

REPLY=
while read -r line; do
    REPLY="$line"
done < file

echo "REPLY=$REPLY"