Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
shell脚本问题:在终端上不起作用,但在脚本中起作用_Shell - Fatal编程技术网

shell脚本问题:在终端上不起作用,但在脚本中起作用

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

我正在玩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
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”存在并被打印。