hawkenの日記

主に自分用メモが中心の技術ブログです。

かっこ (), [], {}の名前が曖昧なまま生きてきたので、ここでケリをつける。

自分用。 ほんとにしょうもない記事になるけど。

()

丸かっこ, 小かっこ parentheses, パーレン

{}

波かっこ, 中かっこ, カーリーブラケッツ

[]

角かっこ, 大かっこ, square brackets, スクエアブラケッツ

<>

山かっこ, angle brackets, アングルブラケッツ

2>&1 は何をやっているのか

シェルのリダイレクトとか、ファイルディスクリプタとかで混乱したのでメモ。

しばしばシェルスクリプトなどで、標準エラー出力と標準出力の両方をまとめてファイルにリダイレクトする場合、以下のような書き方をする。

ls > dirlist  2>&1

正直どいういう理屈なのかわからずつかっていた。 2>&1 は具体的になにをしているのか?

man bashより

リダイレクトの順番には意味がある点に注意してください。 例えば、次のコマンド

      ls > dirlist 2>&1

は標準出力と標準エラー出力を両方ともファイル dirlist に書き込みますが、次のコマンド

     ls 2>&1 > dirlist

では標準出力だけがファイル dirlist に書き込まれます。なぜなら後者の場合には、標準エラー出力は dirlist にリダイレクトされる前の標準出力の複製となるからです。

2>&1 はファイル・ディスクリプタ1を複製し、ファイル・ディスクリプタ2を作成することことらしい。そうすることで標準エラー出力の向き先が"現時点"の標準出力の向き先にと同じになる。

コマンドは左側から解釈されるため、下記のように書いた場合 >dirlist によって標準出力(fd1)の向き先がdirlistに変わったあと、2>&1 によって、標準エラー出力(fd2)の向き先が標準出力(fd1)と同じdirlistに変わっている。

ls > dirlist 2>&1

下記ように 2>&1>dirlist より先に書いた場合、標準エラー出力(fd2)の向き先は標準出力(fd1)と同じ端末になった後、> dirlistによって、標準出力先のみ dirlistになる。

ls 2>&1 > dirlist

シェルスクリプト便利技 exec > file

メモ

execで実行ファイルを指定すると、現在のプロセスを置き換える形でプログラムが実行されます。

exec {実行ファイル}

exec > file を実行すると、現在実行しているシェルの標準出力をファイルにリダイレクトします。 シェルスクリプト内で以下のように実行すれば、簡単にシェルの出力結果をログに残せます。

exec >> text.log

以降の標準出力を標準エラー出力にリダイレクトすることも可能です。

exec >&2

標準出力を端末に戻す場合は

exec > /dev/tty