2013-06-01 2 views
8

要約:私は、バックグラウンドでプロセスを実行するbashスクリプトを持っています。通常のコマンドとそのようなコマンド置換ブロック$(...)となります。スクリプト自体は、バックグラウンドに分岐するプロセスを生成します。

#!/bin/sh 
echo something 
sleep 5 & 

はシェルでこのスクリプトを実行すると、すぐに戻ります(と印刷「何か」)$(...)内部でそれを実行するには、バックグラウンドに「スリープ」を待って、5秒間停止します。このテストケースに減少させることができます終わる。

コマンド置換シェル内で開始され、そのプロセスツリー内のすべての子プロセスを含む、バックグラウンドでプロセスを起動するものに適用されます。 bashとzshの両方に影響を与えると思われ、他の人は試していません。


オリジナルの質問:は、私はそれが実行されるたびに標準出力に値を印刷することになっても、それがXのクリップボードにコピーされたbashスクリプトを持っています。

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

このスクリプトは(の「何か」を呼びましょう)(実際には別のコマンドの出力である)、この単語を取得するために使用されることを意味しているとのようなさまざまな方法で使用される:

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

通常のstdoutに出力し、通常のXアプリケーションで使用するために出力をクリップボードにコピーします。また、コマンドの途中でこの単語を挿入するために、stdoutをbashコマンドに置き換えることもできます。

しかし、bashコマンドの置換により、xclipは強制的にフォアグラウンドに残ります。 xclipは通常、クライアントがクリップボードの内容を提供することをXクリップボードに要求しているので、自身をデーモン化します。デフォルトの動作は、クリップボードの内容が置き換えられたときに終了させることです。

$(...)殻の内側に

をdaemonizes何でも、誰でも、この動作を説明することができることを適用しているようですので、XCLIPで、この問題を持った後、私は、私はこの質問の冒頭で書いた最小限のテストケースを作ったのですか?私はそれを避ける方法はありますか?

答えて

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 

あなたがバックグラウンドに、プロセスの標準出力をキャプチャする機能を失うことになるが、あなたは、バックグラウンドでそれを実行している場合、あなたはおそらく気にしない:これはすぐに戻ります。 bg.shプロセスは常にディスクに書き込むことができます。

+0

Woo!完璧で非常に簡単なソリューション。ありがとう! – dequis

+0

ちなみに、/ dev/nullの代わりにファイルにリダイレクトすると出力をキャプチャするように見えますが、ここでは出力ファイルはバックグラウンドプロセスが終了した後に更新されるようです。 (私はこれのためにそれを必要としない) – dequis

関連する問題