Linux 如何在父shell和子shell之间使用相同的bash变量
我有一个类似于以下内容的bash脚本:Linux 如何在父shell和子shell之间使用相同的bash变量,linux,bash,scripting,variables,Linux,Bash,Scripting,Variables,我有一个类似于以下内容的bash脚本: function test { running=$(( $running - 1 )) } running=0 test & echo $running 因为test函数是在一个子shell中运行的,所以它不会影响正在运行的变量,并且我在屏幕上得到了0。我需要子shell能够更改父shell变量,如何才能做到这一点?我试过出口,但没用 编辑感谢所有有用的答案,我想在后台运行此函数的原因是允许同时运行多个函数。我需要能够调用父脚本,在所有函数完
function test
{
running=$(( $running - 1 ))
}
running=0
test &
echo $running
因为test函数是在一个子shell中运行的,所以它不会影响正在运行的变量,并且我在屏幕上得到了0。我需要子shell能够更改父shell变量,如何才能做到这一点?我试过出口,但没用
编辑感谢所有有用的答案,我想在后台运行此函数的原因是允许同时运行多个函数。我需要能够调用父脚本,在所有函数完成时告诉它。我一直在使用pids来实现这一点,但我不喜欢检查循环中是否有多个进程一直处于活动状态 你真的不能。每个shell都有一个环境副本 看 但对于您在示例中所做的操作,请尝试以下脚本: #!/bin/bash function testSO { running=$(( $running - 1 )); return $running; } #!/bin/bash 函数testSO { running=$($running-1)); 返回$running; } 并将其作为: running=$(testSO) 正在运行=$(testSO)
如果只想有效地返回值,则只需从函数返回值。使用别名而不是函数。或者使用函数体编写脚本,并使用
源代码执行它
这两种解决方案都避免创建子shell。通常无法创建子shell。为什么要在子shell中运行该函数?背景呢?如果你告诉我们你想做什么,我们可能会帮你更多。实际上,你出口的是“向下”,而不是“向上”。在这种情况下,删除&
会有所帮助,但我相信你真的需要在后台运行它,如果这样说的话。((运行--)
或((-running))
这与在前台运行testSO
是一样的,但我认为这不是OP想要的。你混淆了两种不同的“返回”方式来自函数的信息:将其作为状态返回(返回的功能),并将其发送到stdout(即$(…)
捕获的功能)。您需要使用echo$running
和running=$(testSO)
或返回$running
和testSO;running=$?
不是两者的混合。由于运行
似乎不是一个状态指示器(即非零并不表示错误),因此我选择第一种方法。感谢您的澄清。我不是一个有次地狱的天才,所以我喜欢学习更多。