0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linux bash リダイレクトを整理してみた

Posted at

初めに

今まで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を省略しているパターンが多くこれをこれを知らないと意味不明な呪文のようになって混乱していました。
上の表のように順に書いたら多少は整理できたかと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?