バックグラウンドコマンドの実行が終了したときにbashが「完了」を表示しないようにする


34

次の&ように、バックグラウンドでコマンドを実行すると:

sleep 2 &

コマンドが終了すると、「完了」が表示されます。「完了」メッセージが表示されないようにするにはどうすればよいですか?

回答:


34

サブシェルでコマンドを実行します。

(sleep 2 &)

これを使用すると、呼び出し元シェル内のジョブの制御を失うことに注意してください(jobs何も表示されません)。
mighq

36

組み込みのシェルを実行します。

$ set +m

これは、「モニターモード」をオフにすることで機能し、シェルはバックグラウンドジョブの終了を報告しません。

次のようなサブシェルでコマンドを実行しますが:

$ (sleep 2&)

... メッセージ無効になります。それが機能する唯一の理由は、モニターモードがデフォルトでインタラクティブシェルに対してのみ有効になっているためです。つまり、サブシェルは、自動「set + m」を持つ追加のシェルを実行することにより、メッセージを回避します


4
この出力はスリープによって実行されないことに注意してください。終了したバックグラウンドジョブについて通知するだけのbashシェル。
flolo

8

以前の2つの答えを明確にしたいと思います。シェルのコマンドから「完了」メッセージを表示したくない場合set +mは、それが先です。それを.profileや.bashrcに入れるだけで完了です。ただし、これを入力すると次のことに注意してください。

set +m
sleep 2 &
set -m

finalの後にスリープが終了set -mすると、完了メッセージが表示されます。

単一のコマンド呼び出しでメッセージを無効にしたい場合は、サブシェルの手法を使用します(sleep 2 &)

正直なところ、私は知っていたset +mので、私を啓発してWoobleに+1しました。ただし、2つのソリューションのどちらを使用するかは、何をしようとしているかによって異なることに注意してください。


0

サブシェルがなくても、次のことができます。

silent_background() {
    { 2>&3 "$@"& } 3>&2 2>-
    disown &>/dev/null  # Close STD{OUT,ERR} for silence if job has already completed
}

silent_background sleep 5

この答えに基づいて。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.