Bash 后台作业

发布于 2024-11-26 05:28:05 字数 144 浏览 1 评论 0原文

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

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

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

Is there a way to allow a background job in bash to modify variables? for ex:

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

I'd like the value of a to be 2 not 1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

猫瑾少女 2024-12-03 05:28:05

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

Variables can't be sent back to a parent process from a child, so what you're trying to do is impossible. It's the same reason that cd has to be a shell builtin rather than an executable in its own right. If it were an executable, it would run, change the directory, and then exit, leaving you back in the shell which hasn't had its directory changed.

黯然#的苍凉 2024-12-03 05:28:05

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

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

A child process can't affect his parent's environment, but if your background process ends after the evaluation you can "pass" the value as an exit code. The parent can catch it with the wait command. Here is an example of a background process returning a variable incremented by one:

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
梅窗月明清似水 2024-12-03 05:28:05

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

示例:

#!/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 的父级。

As Carl explained quite well, it is impossible.

An example:

#!/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"

Output would show child with value 1-10, and then parent with old value of 1.

橘寄 2024-12-03 05:28:05
-> a=1
-> a=2; exit &
-> echo $a
2
-> a=1
-> a=2; exit &
-> echo $a
2
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文