92

bashでバックグラウンドでプロセスを実行するのはかなり簡単です。

$ echo "Hello I'm a background task" &
[1] 2076
Hello I'm a background task
[1]+  Done                    echo "Hello I'm a background task"

ただし、出力は冗長です。最初の行には、バックグラウンドタスクのジョブIDとプロセスIDが出力され、次にコマンドの出力が表示され、最後にジョブID、そのステータス、およびジョブをトリガーしたコマンドが表示されます。

バックグラウンドタスクの実行の出力を抑制して、出力が最後にアンパサンドがない場合とまったく同じように見えるようにする方法はありますか?すなわち:

$ echo "Hello I'm a background task" &
Hello I'm a background task

私が尋ねる理由は、タブ補完コマンドの一部としてバックグラウンドプロセスを実行したいので、そのコマンドの出力が意味をなさないようにする必要があるためです。

4

8 に答える 8

109

完了とは関係ありませんが、呼び出しをサブシェルに入れることで、その出力を抑制することができます。

(echo "Hello I'm a background task" &)
于 2011-10-07T13:08:58.287 に答える
14

@shellterの答えに基づいて、これは私のために働きました:

tyler@Tyler-Linux:~$ { echo "Hello I'm a background task" & disown; } 2>/dev/null; sleep .1;
Hello I'm a background task
tyler@Tyler-Linux:~$

この背後にある理由はわかりませんが、bashがプロセスIDを出力できないという古い投稿を思い出しました。

于 2014-04-14T01:33:38.873 に答える
12

一部の新しいバージョンのbashおよびksh93では、サブシェルまたはプロセスグループ(つまり{ ... })で囲むことができます。

/home/shellter $ { echo "Hello I'm a background task" & } 2>/dev/null
Hello I'm a background task
/home/shellter $
于 2011-10-07T13:08:34.660 に答える
7

この答えに基づいて、私はより簡潔で正しいものを思いついた:

silent_background() {
    { 2>&3 "$@"& } 3>&2 2>/dev/null
    disown &>/dev/null  # Prevent whine if job has already completed
}
silent_background date
于 2018-06-27T10:58:05.113 に答える
6

上記の回答に基づいて、コマンドからstderrが通過できるようにする必要がある場合:

f() { echo "Hello I'm a background task" >&2; }
{ f 2>&3 &} 3>&2 2>/dev/null
于 2014-12-07T05:56:34.867 に答える
5

試す:

user@host:~$ read < <( echo "Hello I'm a background task" & echo $! )
user@host:~$ echo $REPLY
28677

そして、出力PIDの両方を非表示にしました。$REPLYから引き続きPIDを取得できることに注意してください

于 2016-06-13T00:38:28.453 に答える
4

古い投稿への返信は申し訳ありませんが、これは他の人にも役立つと思います。これはGoogleでの最初の返信です。

このメソッド(サブシェル)で問題が発生し、「待機」を使用していました。ただし、関数内で実行していたため、次のことができました。

function a {
    echo "I'm background task $1"
    sleep 5
}

function b {
    for i in {1..10}; do
        a $i &
    done
    wait
} 2>/dev/null

そして私がそれを実行するとき:

$ b
I'm background task 1
I'm background task 3
I'm background task 2
I'm background task 4
I'm background task 6
I'm background task 7
I'm background task 5
I'm background task 9
I'm background task 8
I'm background task 10

また、プロンプトが返されるまでに5秒の遅延があります。

于 2017-03-21T09:53:50.363 に答える
1

サブシェルソリューションは機能しますが、バックグラウンドジョブを待機できるようにしたかったのです(最後に「完了」メッセージが表示されないようにしました)。$!現在のインタラクティブシェルでは、サブシェルからの送信は「待機可能」ではありません。私のために働いた唯一の解決策は、非常に単純な独自の待機関数を使用することでした。

myWait() {
  while true; do
    sleep 1; STOP=1
    for p in $*; do
      ps -p $p >/dev/null && STOP=0 && break
    done
    ((STOP==1)) && return 0
  done
}

i=0
((i++)); p[$i]=$(do_whatever1 & echo $!)
((i++)); p[$i]=$(do_whatever2 & echo $!)
..
myWait ${p[*]}

簡単です。

于 2017-09-26T17:12:16.873 に答える