2つの機能を含むスクリプトがあります。関数は他の関数をバックグラウンドプロセスとして開始し、そのプロセスのUIDを返します。 PIDをプライベート変数に入れたくない限り、これはうまくいきます。 PIDを変数に割り当てようとすると、バックグラウンド操作が完了するまでスクリプトは停止します。
この動作は、次のスクリプトを使用して実証できます。
#!/bin/sh
foo () {
bar & # start bar in background
echo $! # return bars' PID
}
bar () {
sleep 5 # some background operation
}
FOO=$(foo) # remember the PID of bar
echo $FOO # expectation: should echo immediately
# reality: echo after five seconds
bar
だから私の質問は:関数を起動した後にbar
戻りを待たずにスクリプトを実行し続けるにはどうすればよいですか?
答え1
メインシェルがコマンド置換がそれ以上の入力をキャプチャしないことがわかるように、このサブシェルによって開始されたサブシェルは$(foo)
完全に終了する必要があります(すべてのバックグラウンドプロセスも含む)。結局、bar
寝た後に何かを出力することができます。
ただし、出力をbar
次にリダイレクトできます/dev/null
。
foo () {
bar > /dev/null &
echo "$!"
}
または (Bash または ksh で) コマンドの置換を取り消し、デフォルトのシェルbar
で実行します。
foo() {
typeset -n _pid=$1
bar &
_pid=$!
}
foo FOO
echo "$FOO"
eval
(または標準と同じですsh
。)