Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 文件输入重定向中的Unix读取命令行为_Shell_Unix - Fatal编程技术网

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

Shell 文件输入重定向中的Unix读取命令行为,shell,unix,Shell,Unix,假设我有一个包含可用内容的文件 cat file | read; echo $REPLY 给出空输出 read < file; echo $REPLY 读取

假设我有一个包含可用内容的文件

cat file | read; echo $REPLY
给出空输出

read < file; echo $REPLY
读取
给出文件的第一行作为结果

while IFS= read; do :; done < file; echo $REPLY
而IFS=读取;do:;完成<文件;回音$回复
不打印任何内容,输出为空。在这里,我希望文件的最后一行作为输出,因为我认为迭代将一直进行到文件结束,最后一行将保留在REPLY变量中。这种行为有什么原因吗

while IFS= read; do :; done < file; echo $REPLY
这是一条管道。这意味着
read
在子shell中。因此,它创建的shell变量不会继续存在

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

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


(在sed语言中,
$
表示文件的最后一行,
p
表示打印。因此,
$p
表示打印文件的最后一行。)

如果要使用
while循环在
REPLY
变量中保留文件的最后一行,请使用以下命令:

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

echo "REPLY=$REPLY"
回复=
而read-r行;做
答复:“$line”
完成<文件
echo“REPLY=$REPLY”
reply="$(tail -n1 file)" ; echo $reply
reply="$(sed -n '$p' file )" ; echo $reply
REPLY=
while read -r line; do
    REPLY="$line"
done < file

echo "REPLY=$REPLY"