バックグラウンドでコマンドを実行した後、BASH関数の値をエコーし​​ます。

バックグラウンドでコマンドを実行した後、BASH関数の値をエコーし​​ます。

他のテストで次のコマンドを実行しようとしています。

function echo_test {
  sleep 60 & > /dev/null
  returnpid=$!
  echo $returnpid
}

pidthatwasreturned=$(echo_test)

echo "This was the value that was returned by the function:"
echo $pidthatwasreturned

問題は、バックグラウンドで実行しているにもかかわらず、スリープが完了するまで関数が終了して返されないことです。私が開発しているスクリプトでは、sleepコマンドは長期実行コマンドで効果的に置き換えられます。この関数をオーバーライドしてすぐに返す方法はありますか?

答え1

関数は終了しますが、シェルはpipe関数内で関数を読み取るコードを設定stdoutし、その結果を変数に入れますpidthatwasreturned

ただし、ファイル記述子はstdoutこのコマンドによって60秒間sleep開いたままになります。

関数はechoコマンドの出力をリダイレクトしますが、そのsleepコマンドはリダイレクトしないため、変数の割り当てはstdoutfromsleepが閉じるのを待ちます。

&とを変更する> /dev/nullことでうまく動作し、にバグがない限りでもBourne Shellうまく動作するはずです。bashbash

関連情報