インタラクティブなシェルでバックグランドジョブの完了メッセージを表示させない方法

Bash

はじめに

インタラクティブなシェルでバックグランドジョブを実行させると、ジョブ完了のメッセージが表示されますが、 .bashrc あるいは .zshrc でバックグラウンドジョブ実行した場合にこれが煩わしいのでなんとかしたいと思いました。

解決方法を共有します。

検証環境

$ uname -moi
x86_64 x86_64 GNU/Linux
$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

問題の確認

バックグランドジョブ実行を使うと、時間のかかる処理を実行中に別の操作を行うことができます。
便利なのですが、ジョブ完了のメッセージが煩わしい場合があります。
( ex: 調査をしていて、コンソール出力内容をログとして残している )

ここでいう「ジョブ完了メッセージ」とは以下のようなコマンドを実行した際に出力される内容です。

<実行コマンド>

> /dev/null &           # バックグラウンドジョブ実行(何でも良い)
sleep 1                 # バックグラウンドジョブの完了を待つ

実行結果は以下のようになります。

$ > /dev/null &           # バックグラウンドジョブ実行(何でも良い)
[1] 118
$ sleep 1                 # バックグラウンドジョブの完了を待つ
[1]+  Done                     > /dev/null

Done の行を出力したくない場合にどうしたらよいでしょう?

対処法

バックグラウンド実行させるジョブを (...) のようにカッコで囲んであげるだけで解決できます。

<実行コマンド>

( > /dev/null & )       # バックグラウンドジョブ実行(何でも良い)
sleep 1                 # バックグラウンドジョブの完了を待つ

実行結果は以下の通り。ジョブ完了メッセージが表示されなくなりました。

$ ( > /dev/null & )       # バックグラウンドジョブ実行(何でも良い)
$ sleep 1                 # バックグラウンドジョブの完了を待つ

ひとこと

.bashrc.zshrcsource コマンド経由でなにか処理を呼び出さないといけない場合などにこの方法が使えます。

Bash