バックグラウンドで機能を開始し、PIDを保存します。

バックグラウンドで機能を開始し、PIDを保存します。

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。)

関連情報