shell脚本问题:在终端上不起作用,但在脚本中起作用
我正在玩shell脚本,突然发生了一件奇怪的事情。我需要有人解释一下 我有一个文件“infle”,内容:shell脚本问题:在终端上不起作用,但在脚本中起作用,shell,Shell,我正在玩shell脚本,突然发生了一件奇怪的事情。我需要有人解释一下 我有一个文件“infle”,内容: line one line2 third line last read var1 echo $var1 测试脚本test.sh,内容: line one line2 third line last read var1 echo $var1 我执行: cat infile | ./test.sh 产量为 line one 然后我做了: cat infile | read var1
line one
line2
third line
last
read var1
echo $var1
测试脚本test.sh,内容:
line one
line2
third line
last
read var1
echo $var1
我执行:
cat infile | ./test.sh
产量为
line one
然后我做了:
cat infile | read var1
echo $var1
结果:一个空白行
我甚至试过
cat infile | read var1; echo $var1;
同样的结果
为什么会发生这种情况?管道会导致它后面的命令在子shell中运行,这意味着环境变量不会传播到主shell。使用重定向或字符串来绕过此问题:
read var1 < infile
read var1
或尝试以下操作:
cat file | ( read var1; echo $var1; )
这是因为在原始示例中,|启动了一个新的子shell,其中设置了var1,但主shell(echo所在的位置)没有“看到”这个变量。但在本例中,“read”和“echo”在同一个shell中运行,因此“var1”存在并被打印。