摘要: 我有一个Bash脚本,它在后台运行进程,并且应该像正常命令一样工作,也可以在命令替代块中使用,例如$(...)
。脚本本身会生成一个分支到后台的进程。可以将其简化为此测试案例:
#!/bin/sh
echo something
sleep 5 &
在shell中运行此脚本将立即返回(并打印“something”),在 $(...)
内部运行它将挂起5秒钟,等待后台的“sleep”完成。
适用于在命令替换shell内启动并在后台产生进程的任何内容,包括该进程树中的任何子进程。似乎影响bash和zsh,尚未尝试其他Shell。
原始问题:我有一个bash脚本,每次运行时都应该将一个值输出到stdout,并将其复制到X剪贴板中。
#!/bin/sh
echo something
echo something | xclip -selection clipboard
这个脚本(我们称之为“something”)旨在用于获取此单词(实际上是另一个命令的输出),并以不同的方式使用,例如:
$ something
something
$ xclip -o -selection clipboard
something
$ echo $(something)
^C
向标准输出打印内容,将输出复制到剪贴板中以在常规X应用程序中使用,并且也应该能够使用Bash命令替换将标准输出插入到任何命令的中间。
但是,Bash命令替换似乎强制xclip
保持在前台运行。由于X剪贴板要求客户端提供剪贴板内容,因此xclip
通常会将自己设为守护进程,并且默认行为是一旦剪贴板内容被替换就退出。
在遇到xclip的问题后,我编写了本问题开头的最小测试用例,因此似乎适用于在$(...)
Shell中内部设置为守护进程的任何内容。
有人可以解释这种行为吗?有没有办法避免它?