概要:バックグラウンドでプロセスを実行する bash スクリプトがあり、通常のコマンドとして、および などのコマンド置換ブロック内で動作するはず$(...)
です。スクリプト自体が、バックグラウンドに分岐するプロセスを生成します。このテスト ケースに縮小できます。
#!/bin/sh
echo something
sleep 5 &
このスクリプトをシェルで実行するとすぐに復帰し (そして「何か」を出力します)、内部で実行すると$(...)
5 秒間ハングし、バックグラウンドの「スリープ」が終了するのを待ちます。
コマンド置換シェル内で開始され、バックグラウンドでプロセスを生成するすべてのものに適用されます。これには、明らかにそのプロセス ツリー内のすべての子が含まれます。bash と zsh の両方に影響するようですが、他は試していません。
元の質問:値を stdout に出力し、実行するたびにそれを X クリップボードにコピーすることになっている bash スクリプトがあります。
#!/bin/sh
echo something
echo something | xclip -selection clipboard
このスクリプト(「何か」と呼びましょう)は、この単語(実際には別のコマンドの出力)を取得するために使用され、次のようなさまざまな方法で使用されることを意図しています。
$ something
something
$ xclip -o -selection clipboard
something
$ echo $(something)
^C
通常の stdout に出力し、出力をクリップボードにコピーして通常の X アプリケーションで使用します。また、bash コマンド置換で stdout を使用して、この単語を任意のコマンドの途中に挿入することもできます。
xclip
ただし、bash コマンドの置換は、フォアグラウンドでの存続を強制するようです。xclip
X クリップボードはクライアントがクリップボードの内容を提供する必要があるため、通常は自身をデーモン化します。デフォルトの動作では、クリップボードの内容が置き換えられると終了します。
xclipでこの問題が発生した後、この質問の冒頭で書いた最小限のテストケースを作成したので、$(...)
シェル内でデーモン化するものはすべて適用されるようです
誰でもこの動作を説明できますか? 回避する方法はありますか?