摘要:我有一个 bash 脚本,它在后台运行一个进程,并且应该作为普通命令在命令替换块中工作,例如$(...)
. 脚本本身会产生一个分叉到后台的进程。可以简化为这个测试用例:
#!/bin/sh
echo something
sleep 5 &
在 shell 中运行此脚本将立即返回(并打印“某物”),在其中运行它$(...)
会挂起 5 秒钟,等待后台“睡眠”完成。
适用于在命令替换 shell 内启动的任何内容并在后台生成进程,显然包括该进程树中的任何子进程。好像对bash和zsh都有影响,其他的没试过。
原始问题:我有一个 bash 脚本,它应该将一个值打印到标准输出,并在每次运行时将其复制到 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中守护进程的东西
谁能解释这种行为?有什么办法可以避免吗?