为什么我看到的每个示例都有while IFS= read line
而不是while IFS=; read line
?
我认为name=value command
可能设置了一个局部变量,但sentence="hello" echo $sentence
不起作用,而sentence="hello"; echo $sentence
则不行。
答案 0 :(得分:12)
在:
name=value command
语法为name
设置value
到command
。在您的示例中:
$ 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 $sentence
,sentence
将位于echo
命令的环境中(尝试此操作以显示自己:sentence=HI env | fgrep sentence
),但不在shell中您正在调用它,在您尝试时将其作为参数传递给echo
。