gpt4 book ai didi

Bash 命令替换 ( $(...) ) 强制进程到前台

转载 作者:行者123 更新时间:2023-11-29 08:53:01 24 4
gpt4 key购买 nike

总结:我有一个在后台运行进程的 bash 脚本,应该作为普通命令工作,并在命令替换 block (例如 $(...) 。该脚本本身会生成一个 fork 到后台的进程。它可以简化为这个测试用例:

#!/bin/sh
echo something
sleep 5 &

在 shell 中运行这个脚本会立即返回(并打印“something”),在 $(...) 中运行它会挂起 5 秒,等待后台“ sleep ”完成。

适用于在命令替换 shell 中启动并在后台生成进程的任何内容,显然包括该进程树中的任何子进程。似乎同时影响 bash 和 zsh,还没有尝试过其他的。


原始问题:我有一个 bash 脚本,它应该在每次运行时将一个值打印到 stdout 并将其复制到 X 剪贴板。

#!/bin/sh
echo something
echo something | xclip -selection clipboard

这个脚本(我们称它为“某物”)旨在用于获取这个词(实际上是另一个命令的输出)并以不同的方式使用,例如:

$ something
something
$ xclip -o -selection clipboard
something
$ echo $(something)
^C

打印到正常的标准输出,将输出复制到剪贴板以在正常的 X 应用程序中使用,并且还应该能够使用带有 bash 命令替换的标准输出,以在任何命令的中间插入这个词。

然而,bash 命令替换似乎强制 xclip 在前台保持事件状态。 xclip 通常自行守护,因为 X 剪贴板要求客户端提供剪贴板内容,默认行为是在替换剪贴板内容后使其退出。

在 xclip 出现这个问题后,我做了我在这个问题开头写的最小测试用例,所以它似乎应用了 $(...) shell 中守护进程的任何东西

谁能解释这种行为?有什么办法可以避免吗?

最佳答案

如果您希望后台进程不干扰命令替换,您必须断开其标准输出。这将立即返回:

$ cat bg.sh 
#!/bin/sh
echo before
sleep 5 >/dev/null &
echo after
$ date; x=$(./bg.sh); date; echo "$x"
Sat Jun 1 13:02:26 EDT 2013
Sat Jun 1 13:02:26 EDT 2013
before
after

您将失去捕获后台进程标准输出的能力,但如果您在后台运行它,您可能不在乎。 bg.sh 进程始终可以写入磁盘。

关于Bash 命令替换 ( $(...) ) 强制进程到前台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16874043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com