有没有办法允许bash中的后台作业修改变量?例如:
[bash]# a=1
[bash]# a=2 &
[1] 14533
[bash]# echo $a
1
我希望a的值为2而不是1
答案 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