在这种情况下什么是“读”?

在这种情况下什么是“读”?

考虑到:

cat filename | while read i
do
    echo $i
done

所有其他答案都失败了,这个有效!这会将文本文件逐行剪切。
我想了解更多关键部分。但我找不到源代码。 which read无输出。在这种情况下什么是“读”?

答案1

这个有效

事实上并非如此。将read解析该行并根据 shell 规则重建它。例如,

echo '  hello  world  ' |
    ( read x; echo ">$x<" )

捕获的内容$x既没有前导空格,也没有尾随空格:

>hello  world<

(更改read xIFS= read -r x并比较结果。)此外,如果在使用变量时不使用双引号$x,则会对其进行进一步处理。例如,

touch a b c    # Create three empty files
x='here is my star: *'

echo "$x"      # Outputs: here is my star: *
echo $x        # Outputs: here is my star: a b c

在您的情况下,文件a, b,c还将由当前目录中的文件集进行补充。 (我应该指出,touch只会创建空文件作为副作用;如果文件已经存在,它只会将上次修改时间更新为现在并且绝对不会截断或重新创建它们。)

毕竟,您将无法使用$x循环外部的值,因为循环位于子 shell 中。 (x='demo'在循环开始之前设置,然后echo "$x"在循环结束之后设置。它将不受循环影响。)在这种情况下,您不需要,cat因为只有一个文件:

while IFS= read -r x
do
    printf '%s\n' "$x"
done <filename

但即使如此,通常也不需要像这样循环输入,因为许多工具无论如何都会逐行处理文件。比照

cat filename

答案2

这是readshell 内置命令,即由 POSIX 指定。 Bash 的实现是Bash 手册中描述,其源代码是Bash 存储库的一部分

相关内容