コマンドは終了しません
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
答え2
特にバックグラウンドコマンドのPIDを取得することに興味があります。
私の考えでは、あなたはpidをしたくtail
ないと思いますbash
。
bash -c
ただ使用する必要はありません
tail -f /dev/null & echo $!