Backgroundでmakeしたいじゃんね。

ちょっとしたパッケージなら気にならないけど、TeX関係とかPHPとかになってくるとmake installする時間は馬鹿にならない。その間ずっと画面使えないのは辛いよね。
screenすれば良いけど、screenの無い環境でmakeしたいときはどうする?
裏でmake installしてしまおう。

# make install &

↑とりあえずバックグラウンド実行する方法だけど、これじゃ駄目。画面に文字が出力されるのが邪魔でしょうがない。

# make install > hoge &

↑じゃあリダイレクトすれば解決するはずー、とリダイレクトしてみても文字は出力される。なぜ?
それはこれらのメッセージが標準出力ではなく標準エラー出力に出されているからなのだー。
だからこれらの文字を消そうと思ったら標準エラー出力の出力先も標準出力と同じにしなければならない。
で、それをしてくれるのが 2>&1 という書き方。ファイルディスクリプタ2番(標準エラー出力)の出力先を、ファイルディスクリプタ1番(標準出力)の出力先と同じにしてくれる。

# make install > hoge 2>&1 &

これでOK。エラーの場合にログが残ってる点も便利ですね!*1


途中で質問に答えなければいけないタイプのmakeの場合は、yes というプログラムを使うと楽々。

# yes | make install > hoge 2>&1 &

yes は、ひたすら y を出力し続けるという yharian チックなプログラム。これをパイプしておけば、もし質問が出ても自動的に y を入力したことにしてくれる。便利、かも。(使ったことないけど)


いやまあscreen使えば良いんですけど。



追記

検索ワード 「途中でバックグラウンド」 で来ている人がいたので追記。

ジョブの途中からバックグラウンド実行にする方法:

C-z で現在のジョブをサスペンド出来る。で、そのあと bg すればサスペンド中のジョブがバックグラウンド実行に切り替わる。
サスペンドしているのがたくさんある場合は jobs でジョブ番号を確認した上で bg の引数にその番号を指定する。以上!
ただし標準入出力等の切り替えは途中からじゃ(多分)出来ないので、文字は画面に出力され続けます。

*1:makeの方でログ作ってくれる場合もあるけど