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定向到一个日志文件