111
91

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

1>/dev/null 2>&1と2>&1 1>/dev/nullの違い

Last updated at Posted at 2017-03-02

はじめに

「Linuxでコマンドをぶったたいてる時どっちが先だっけ?と迷うヤツ選手権」を開いたら、
恐らく、tarか/dev/nullへのリダイレクトが優勝すると思います。
ということで、今回は優勝候補の/dev/nullへのリダイレクトさんについて調べてみます。
順番間違ってても一見行けそうじゃん?と思うけど、実際はいけないんですよね。

そもそも1とか2とかリダイレクトって何

ところで1とか2とか訳も分からず使ってるけどなんだっけ…という人のために。

1とか2とかはファイルディスクリプタと呼ばれるものです。(以降FDと略します)
FDは「fd_arrayという配列にある、ファイルオブジェクトを指し示すポインタを指し示すポインタ」です。

…書いてて意味が分からないので、図に示します。

fd (15).png

まぁ、背番号みたいなものです。
あー…名前分かんないけど、西武の背番号24番の人にこの荷物届けてください!
っていったらブコビッチに荷物がちゃんと届くようなもんです。

そして、FDの0標準入力1標準出力2標準エラー出力と呼ばれています。
通常、プロセスがエラー以外のメッセージを出力するときは標準出力、
エラーメッセージを出力するときは標準エラー出力を利用します。
(意図的にエラーではないメッセージをエラー出力に出す時もあります)

例えば、lsに存在するファイルと存在しないファイルを引数として与えて実行した場合、
見つかったファイル一覧は標準出力にぶん投げ、「そんなファイル見当たらん!」という
エラーメッセージは標準エラー出力にぶん投げます。
どちらも、基本的にはディスプレイに出力されます。

しかしながら、必ずしもディスプレイに表示したいわけではなく、
たまにはコマンド結果をファイルに記録しておきたいこともあります。
エラーメッセージは邪魔だから、エラーメッセージのみ表示しないようにしたい場面もあります。

そういったとき、FDの指し示す先を変更する事をリダイレクトと呼びます。

1>/dev/null 2>&1の動き

では、ようやく話の中心です。

1>/dev/null 2>&1と2>&1 1>/dev/nullは何が違うのか。
前者はメッセージがすべて表示されなくなります。
後者はありがちな間違いで、エラーメッセージが表示されてしまいます。
前者はいいやつ、後者はだめなやつですね。

まずいいやつから見ていきます。
(実際はプロセスがcloneされるのですが、そこは割愛で)

まず最初に、/dev/nullを開きます。FD3が割り当たります。
fd (5).png

次に、FD3を複製してFD1を作成します。つまり、FD1の参照先が/dev/nullに変わります
fd (6).png

FD3を閉じます。ここまでが1>/dev/nullの中身。
fd (7).png

そして、FD1を複製してFD2を作成します。つまり、FD2の参照先も/dev/nullに変わります。これが2>&1。
fd (8).png

結果、めでたく標準出力と標準エラー出力が/dev/nullを向きました。

2>&1 1>/dev/nullの動き

だめなやつです。

まず最初に、FD1を複製してFD2を作成します。この時点で同じものを見ているので、意味ありません。これが2>&1。
fd (9).png

次に、/dev/nullを開きます。FD3が割り当たります。
fd (11).png

FD3を複製してFD1を作成します。FD1の参照先が/dev/nullに変わります。
fd (12).png

FD3を閉じます。ここまでで1>/dev/null。
fd (13).png

結局、エラーメッセージが標準エラー出力から画面に出るだけです。

ただのリダイレクトの話なのに、システムコールまで調べる羽目になりました。
動作的にはこうだろうな~、でもそれってどういう根拠で?
じゃあ調べよう…(ズブズブ

OSとかkernelとかファイルシステムとか考えた人はホント凄いですわ…。

111
91
2

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
111
91

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?