初めに
今までlinuxコマンドの実行結果をプログラムの中で一時ファイルなどに吐き出して
処理する際に誰かのコピペで何とかしてきたのですが、
を読んでいてリダイレクト内容が明確になったのでメモとして書いておきたいと思います。
他の方も同じ内容の記事を書かれていますが、私の個人的なメモとして残したいと思います。
リダイレクトとは
例えば lsコマンドの結果をファイルに保存したいとき
$ ls > outfile
のようにするとlsの実行結果をoutfileに保存することができますが少し深堀したいと思います。
そもそもファイルディスクリプタとは
C言語とかでファイルに何かを書き込もうとするときファイルディスクリプタ(fd)というのを使用して書き込みます。
int fd = open ("filename",O_RDWR);
みたいな形でファイルディスクリプタ取得して書き込みます。
ただファイルディスクリプタには3つの特殊なものがあります。
fd | 内容 |
---|---|
0 | 標準入力 |
1 | 標準出力 一般的に処理実行時の結果を表示 |
2 | 標準エラー出力 一般的に処理を実行しようとしたときエラー・ワーニングなどが起きた時に内容が出力される |
リダイレクトの一覧
コマンド | 内容 |
---|---|
$ cmd 1> outfile | cmdの標準出力の結果をoutfileに出力 |
$ cmd > outfile | 同上 (標準出力1を省略) |
$ cmd 2> outfile | cmdの標準エラー出力をoutfileに出力 |
$ cmd 1>> outfile | cmdの標準出力の結果をoutfileに出力(outfileに追記) |
$ cmd >> outfile | 同上 (標準出力1を省略) |
$ cmd 1> outfile 2>&1 | cmdの標準出力をoutfileに出力 標準エラー出力をfd1(outfile)に出力 |
$ cmd > outfile 2>&1 | 同上 (標準出力1を省略) |
$ cmd 1>> outfile 2>&1 | cmdの標準出力をoutfileに出力 標準エラー出力をfd1(outfile)に出力 (outfileに追記) |
$ cmd >> outfile 2>&1 | 同上 (標準出力1を省略) |
$ cmd 2> outfile 1>&2 | cmdの標準エラー出力をoutfileに出力 標準出力をfd2(outfile)に出力 |
$ cmd 2> outfile >&2 | 同上 (標準出力1を省略) |
$ cmd 2>> outfile 1>&2 | cmdの標準エラー出力をoutfileに出力 標準出力をfd2(outfile)に出力 (outfileに追記) |
$ cmd 2>> outfile >&2 | 同上 (標準出力1を省略) |
$ cmd &> outfile | cmdの標準出力、標準エラー出力をoutfileに出力 |
$ cmd &>> outfile | 同上 (outfileに追記) |
まとめ
webなどで見かけるのは標準出力1を省略しているパターンが多くこれをこれを知らないと意味不明な呪文のようになって混乱していました。
上の表のように順に書いたら多少は整理できたかと思います。