Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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
Linux 管道后无法在源代码脚本中更改bash变量?_Linux_Bash_Shell - Fatal编程技术网

Linux 管道后无法在源代码脚本中更改bash变量?

Linux 管道后无法在源代码脚本中更改bash变量?,linux,bash,shell,Linux,Bash,Shell,我构建了一个简单的示例来说明问题: caller.sh: #!/usr/bin/env bash state="loaded" source "sh/callee.sh" 2>&1 echo "$state" #!/usr/bin/env bash state="integrated" #!/usr/bin/env bash state="loaded" source "sh/callee.sh" 2>&1 | cat echo "$state" callee.

我构建了一个简单的示例来说明问题:

caller.sh

#!/usr/bin/env bash
state="loaded"
source "sh/callee.sh" 2>&1
echo "$state"
#!/usr/bin/env bash
state="integrated"
#!/usr/bin/env bash
state="loaded"
source "sh/callee.sh" 2>&1 | cat
echo "$state"
callee.sh

#!/usr/bin/env bash
state="loaded"
source "sh/callee.sh" 2>&1
echo "$state"
#!/usr/bin/env bash
state="integrated"
#!/usr/bin/env bash
state="loaded"
source "sh/callee.sh" 2>&1 | cat
echo "$state"
当我运行
caller.sh
时,它会给出我想要的结果:

integrated
但如果在源命令后添加管道:

caller.sh

#!/usr/bin/env bash
state="loaded"
source "sh/callee.sh" 2>&1
echo "$state"
#!/usr/bin/env bash
state="integrated"
#!/usr/bin/env bash
state="loaded"
source "sh/callee.sh" 2>&1 | cat
echo "$state"
结果是:

loaded

问题:如何在
caller.sh
中保留/检索
$state
的更改值?

您不能使用管道。
source
命令在管道完成后退出的子shell中运行,因此在调用
echo“$state”
的shell中永远不会设置
state
。您可以使用流程替换来“反转”管道:

state="loaded"
source "sh/callee.sh" 2>&1 > >(cat)
echo "$state"

现在
source
在同一个shell中执行。

管道分叉一个子shell,值丢失,一旦子外壳终止,首先使用
cat
的意图是什么?但是为什么这里需要
cat
?第一个
做什么?
cat
就是我在本例中想到的。在我的程序中,我想将stdin和stderr定向到一个日志文件