バックグラウンドジョブのシェルスクリプトでバックティックを実行する方法

バックグラウンドジョブのシェルスクリプトでバックティックを実行する方法

コマンドは終了しません

echo `bash -c 'tail -f /dev/null & echo hello world'`

事実にもかかわらず

bash -c 'tail -f /dev/null & echo hello world'

「hello world」を正しく返します。

バックティック内で評価されるbashスクリプトのコマンドを背景に設定しようとしています。実際、この例で使用しているechoの代わりにevalを実行する必要があります。問題のスクリプトは通常、多くのエクスポートステートメントを出力するSSHエージェントをエミュレートします。ただし、スクリプトにはバックグラウンド操作が必要です。

バックティックの代わりにまたはdisownを使ってみました。バックティックは常にすべての子プロセスが終了するのを待っているようです。この問題を解決する方法はありますか?特にバックグラウンドコマンドのPIDを取得することに興味があります。nohup$()

ベストアンサー1

存在する:

echo `shell code`

以下は廃止予定の形式です。

echo $(shell code)

shell codeサブシェルで評価され、みんな出力後の末尾の改行を削除して引用するのを忘れたので、 に引数で分割+globを渡しますecho

そのために、シェルはサブシェルのstdoutをパイプにし、パイプのもう一方の端からシェルはファイルの終わりまで、つまりstdout(または他のfd)を持つすべてが開かれるまで出力を読み込みます。パイプを閉じて、対応するfdを閉じるか終了します。

存在する:

echo "$(sleep 10 & echo done)"

sleep 10非同期的に実行中であり、サブシェルが終了するのを待たなくても、実行中のプロセスはsleepパイプにstdout(fd 1)が開いていて終了するまでそのまま残るため、シェルは終了するのを待つ必要がありますsleep。これ以上読み取れる出力がないことが分かるまで終了します。

次のように変更すると:

echo "$(sleep 10 > /dev/null & echo done)"

この場合、パイプに開いているfdがないsleepため、バックグラウンドで実行中にすぐに返されることがわかります。sleep

おすすめ記事