bashのリダイレクション 覚え書

コマンドラインプログラムは何らかのメッセージを出力する際、標準出力標準エラー出力の2から選ぶことができる。普通のメッセージは標準出力で、エラーを出力する場合は標準エラー出力を使う。

練習用に以下のファイル “redtest”を作成する。chmod 755して実行可能にしておく。

このスクリプトは標準出力に”standard”を出力し、標準エラー出力に”error”を出力する。

普通に起動すると、両方画面上に出力される。

$ ./redtest
standard
error
$

以下のように実行すると、標準出力はファイル s に保存されて、標準エラー出力は画面に表示される。

$ ./redtest > s
error
$

以下のように実行すると、標準出力は画面に、標準エラー出力はファイル e に保存される。

$ ./redtest 2> e
standard
$

2は標準エラー出力を表し、1は標準出力を表す。最初の例は 1> と書いても動く。

以下のように書くと、両方の出力をファイル a に保存する。

$ ./redtest > a 2>&1
$

2>&1 は「2を1と同じところに出力する」と読む。ここで以下の例を考える。

$ ./redtest 2>&1 > t
error
$ cat t
standard
$

これだとtには標準出力しか保存されていない。これは最初の 2>&1 で「2を1と同じところに出力する」がここではまだ1は画面なので、「標準エラー出力を画面に出力する」と解釈される。つまりその時さしている最終地点に直接結びつくと言うことだと思う。

さらに1個上の例で作ったファイルを見てみると、”error”の出力の方が先に来ているかもしれない。これはバッファリングに関係しているのだと思うがよく分からなかった。

bashのプロンプトに色をつける

bashのプロンプトは環境変数のPS1を変えればいい。ここではちょっと特殊な色をつける方法。

色をつけるにはANSI エスケープシーケンスを使う。エスケープシーケンスを使う場合は、\[ と \]で囲ってその中に書く。エスケープシーケンスで色をつけるには、ESC[値;値m]の形で記述する。ここでESCはオクタルに直して\033になる。値のところは以下の様になる。(参考

Foreground colors
30 Black
31 Red
32 Green
33 Yellow
34 Blue
35 Magenta
36 Cyan
37 White

Background colors
40 Black
41 Red
42 Green
43 Yellow
44 Blue
45 Magenta
46 Cyan
47 White

実験。プロンプトを赤のAAAにする。

実験。背景が青で文字を黄色にする。

書き方がわかりにくいが、以下の太字のxxの部分を上の色コードに変えればいい。

AAAの部分は実際には\uとか\hとか\Wになるのが普通。これらの意味はman bashで”PROMPTING”を検索すれば分かる。

Ubuntuの場合デフォルトのPS1は以下のようになっている。echo $PS1で確認できる。

debian_chrootと言うのはよく分からないのでスルーするとして、これに色を加えて以下の様にしてみた。

このプロンプトを永続的に使うには、~/.bashrcに記述する。