`while IFS= read line` 语法的文档在哪里可以找到?

6
为什么我看到的每个示例都是使用while IFS= read line而不是while IFS=; read line
我认为name=value command可能会设置一个本地变量,但是sentence="hello" echo $sentence不起作用,而sentence="hello"; echo $sentence却可以。

关于read的文档,请在您的终端中(可能是bash),运行help read - user2849202
2个回答

19

这个:

name=value command

语法设置commandnamevalue。以你的示例为例:

$ sentence="hello" echo $sentence

这个 $sentence 是由调用的 shell 展开的,而该 shell 没有看到设置。如果你这样做

$ sentence="hello" sh -c 'echo $sentence'

(注意要使用单引号使得被调用的shell能够展开$变量)它会输出hello。如果你尝试执行

$ sentence="hello"; sh -c 'echo $sentence'

它不会输出任何内容,因为 sentence 设置在当前 shell 中,而不是在被调用的 shell 中,因为它没有被导出。所以

IFS=; read line

这样做不会生效,因为read命令无法看到IFS的设置。


2
这个回答并没有回答真正的问题,即关于文档的问题。 - Dr. Essen

7

在给命令附加参数赋值的情况下,会影响正在执行的命令的环境

man bash中:

通过在简单命令或函数前面添加参数赋值可以临时增加其环境,如上述“PARAMETERS”中所述。这些赋值语句仅影响该命令所看到的环境。

在您的示例中:sentence="hello" echo $sentencesentence将出现在echo命令的环境中(尝试使用sentence=HI env | fgrep sentence显示),但不会出现在您调用它的shell中,这需要将其作为参数传递给echo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接