记录的是什么语法`IFS = read line`?

时间:2011-07-26 13:28:37

标签: bash shell

为什么我看到的每个示例都有while IFS= read line而不是while IFS=; read line

我认为name=value command可能设置了一个局部变量,但sentence="hello" echo $sentence不起作用,而sentence="hello"; echo $sentence则不行。

2 个答案:

答案 0 :(得分:12)

在:

name=value command

语法为name设置valuecommand。在您的示例中:

$ sentence="hello" echo $sentence

$句子由调用shell扩展,它没有看到设置。如果你这样做

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

(请注意单引号使被调用的shell展开$)它将回显hello。如果你试试

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

它不会回显任何内容,因为sentence在当前shell中设置,但不在中,因为它未被导出。所以

IFS=; read line

不会工作,因为read 会看到IFS设置。

答案 1 :(得分:6)

使用参数分配对命令进行前缀会影响正在执行的命令的环境

man bash

  

任何简单命令或功能的环境都可能是   增强   暂时为它添加参数赋值前缀,如   描述   以上参数。这些赋值语句仅影响   该命令看到的环境。

在您的示例中:sentence="hello" echo $sentencesentence将位于echo命令的环境中(尝试此操作以显示自己:sentence=HI env | fgrep sentence),但不在shell中您正在调用它,在您尝试时将其作为参数传递给echo