他のテストで次のコマンドを実行しようとしています。
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
コマンドはリダイレクトしないため、変数の割り当てはstdout
fromsleep
が閉じるのを待ちます。
&
とを変更する> /dev/null
ことでうまく動作し、にバグがない限りでもBourne Shell
うまく動作するはずです。bash
bash