Bash在后台工作

时间:2011-07-25 17:48:20

标签: bash shell background jobs

有没有办法允许bash中的后台作业修改变量?例如:

[bash]# a=1
[bash]# a=2 &
[1] 14533
[bash]# echo $a
1

我希望a的值为2而不是1

4 个答案:

答案 0 :(得分:4)

变量无法从子进程发送回父进程,因此您尝试做的事情是不可能的。这与cd必须是shell内置而不是可执行文件的原因相同。如果它是一个可执行文件,它将运行,更改目录,然后退出,让你回到没有更改其目录的shell。

答案 1 :(得分:1)

子进程不会影响其父级环境,但如果后台进程在评估后结束,则可以将该值“传递”为退出代码。父级可以使用wait命令捕获它。以下是返回变量加1的变量的后台进程示例:

etuardu@subranu:~$ a=1
etuardu@subranu:~$ (exit $[ $a + 1 ]) &
[1] 7486
etuardu@subranu:~$ wait $!; a=$?
[1]+  Exit 2                  ( exit $[ $a + 1 ] )
etuardu@subranu:~$ echo $a
2

答案 2 :(得分:0)

正如卡尔解释得很好,这是不可能的。

一个例子:

#!/bin/bash

a=1
for i in 1 2 3 4 5 6 7 8 9 10
do
    let a=a+1 ;echo "Child value $a"
done &
sleep 2
echo "Parent value $a"

输出将显示值为1-10的子项,然后显示旧值为1的父项。

答案 3 :(得分:-1)

-> a=1
-> a=2; exit &
-> echo $a
2