#!/bin/sh
echo "hello world" | read var1 var2
echo $var1
echo $var2
不会产生任何输出,因为管道在子外壳中运行它们的每个组件。子shell继承父shell 变量的副本,而不是共享它们。试试这个:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
(
echo $foo
foo="foo contents modified"
echo $foo
)
echo $foo
括号定义了在子 shell 中运行的代码区域,并且 $foo 在其中被修改后保留其原始值。
现在试试这个:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
{
echo $foo
foo="foo contents modified"
echo $foo
}
echo $foo
大括号纯粹是为了分组,没有创建子shell,大括号内修改的 $foo 与外面修改的 $foo 相同。
现在试试这个:
#!/bin/sh
echo "hello world" | {
read var1 var2
echo $var1
echo $var2
}
echo $var1
echo $var2
在大括号内,内置的 read 正确地创建了 $var1 和 $var2 ,您可以看到它们得到了回显。在大括号之外,它们不再存在。大括号内的所有代码都在子shell 中运行,因为它是 pipeline 的一个组件。
您可以在大括号之间放置任意数量的代码,因此当您需要运行一个解析其他输出的 shell 脚本块时,您可以使用这种管道到块的构造。