2013-06-01 38 views
8

摘要:我有一个bash脚本在后台运行进程,并且应该作为普通命令工作,并在命令替换块作为$(...)。脚本本身产生了一个分叉到背景的过程。它可以降低到这个测试用例:

#!/bin/sh 
echo something 
sleep 5 & 

在shell运行此脚本将立即返回(和打印“东西”),运行它里面$(...)将挂起5秒钟,等待中背景的“休眠”完成。

适用于在启动该命令替换外壳内部,并产生在后台进程,包括在这个过程中树显然是任何东西的孩子。似乎同时影响bash和zsh,还没有尝试过别人。


原题:我有一个应该打印值到标准输出,并把它复制到X剪贴板进行每次运行bash脚本。

#!/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我做了我在这个问题一开始写的最小测试用例这个问题后,所以它似乎适用的是什么,该$(...)壳内daemonizes

任何人都可以解释这种现象?有什么办法可以避免它吗?

回答

12

如果您希望后退进程不干扰命令替换,则必须断开它的stdout。这将立即返回:

$ 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 

你就失去了捕捉背景程序的标准输出的能力,但如果你在后台运行它,你可能不关心。进程可以始终写入磁盘。

+0

呜!完美而极其简单的解决方案谢谢! – dequis

+0

顺便说一句,重定向到一个文件而不是/ dev/null似乎工作捕获输出,但至少在这里,输出文件似乎只有在后台进程退出后才会更新。 (虽然我不需要它) – dequis