Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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 如何在父shell和子shell之间使用相同的bash变量_Linux_Bash_Scripting_Variables - Fatal编程技术网

Linux 如何在父shell和子shell之间使用相同的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变量,如何才能做到这一点?我试过出口,但没用 编辑感谢所有有用的答案,我想在后台运行此函数的原因是允许同时运行多个函数。我需要能够调用父脚本,在所有函数完

我有一个类似于以下内容的bash脚本:


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=$?
不是两者的混合。由于
运行
似乎不是一个状态指示器(即非零并不表示错误),因此我选择第一种方法。感谢您的澄清。我不是一个有次地狱的天才,所以我喜欢学习更多。