web-dev-qa-db-ja.com

サブシェルと関連コマンドをバックグラウンドに置く方法は?

次のようなサブシェルでシーケンスコマンドを実行します。

(git pull;git rebase develop)&>/dev/null 

これにより、サブシェルとそれによって作成されたすべての子プロセスがバックグラウンドに置かれ、ユーザーに制御が返されると思います。

しかし実際には、ターミナルはしばらくの間ハングアップし、サブシェルでコマンドが終了するのを待っているようです。

だから、なぜこれが起こったのか、そしてこの種の仕事をする正しい方法は何であるかを誰かが説明できますか?.

5
Karl

bashシェルを実行している場合、&>/dev/nullは標準出力とエラーストリームを/dev/nullにリダイレクトします(これは>/dev/null 2>&1と同じです)が、 t ( ... )サブシェルを非同期プロセスとして実行します。そのためには、最後に&を追加する必要があります。

(git pull; git rebase develop) &>/dev/null &

ksh93にはこの機能がなく、POSIXにはありません。

4
Kusalananda

ケースにsleepを追加し、コマンドの最後に&を追加して、バックグラウンドに置くことができます。

(git pull; sleep 3; git rebase develop) &>/dev/null &

または、次を使用できます。

for cmd in $commands
do
    "$cmd" &
done
wait

コマンドの最後にある&はそれをバックグラウンドで実行し、waitはバックグラウンドタスクが完了するまで待機します。

2
Rahul