zsh その7 (749レス)
上下前次1-新
抽出解除 レス栞
93(5): 名無しさん@お腹いっぱい。 [sage] 2012/12/28(金) 00:59:04.41 AAS
標準エラー出力のみをパイプに出力するには
$ command 2>&1 >/dev/null | command2
とすればいいようですが、これの仕組みが分かりません。
なんで 2>&1 としてるのに標準エラー出力は/dev/nullに行かないのですか?
94(2): 名無しさん@お腹いっぱい。 [sage] 2012/12/28(金) 07:34:36.52 AAS
>>93
何回目のFAQだよw
2>&1を実行している時点で標準出力(パイプ)が標準エラー出力にコピーされる。
(以後、2はパイプを指す)
次に、>/dev/null で標準出力が/dev/nullに変更されるが、
これはすでに2にコピー済みの標準エラー出力には関係ない。
95(2): 名無しさん@お腹いっぱい。 [sage] 2012/12/28(金) 08:34:16.69 AAS
>>93
zshのバグです。でも便利なのでずっと直されてません。
107(1): 93 [sage] 2012/12/29(土) 18:53:23.86 AAS
>>94
もしかして >/dev/null よりも | が先に解釈されるんですか?
というか一般的に、リダイレクトよりもパイプの解釈が優先されるのがシェルの仕様?
110: 名無しさん@お腹いっぱい。 [sage] 2012/12/29(土) 21:25:32.38 AAS
>>93 は dup2 を知らないとよく陥る勘違いですな
FAQ になるのもわかる
せっかく zsh を使ってるのだから
command1 >&- 2> >(command2)
とでもするのが良いのかもしれん
113: 93 [sage] 2012/12/30(日) 00:58:27.95 AAS
>>108108(2): 名無しさん@お腹いっぱい。 [sage] 2012/12/29(土) 20:40:41.91 AAS
>>107
リダイレクトは左から順に処理されるだけ.
普通のコマンドは
1 => /dev/stdout
2 => /dev/stderr
だが,2>&1 は「2の出力先を1と同じにする」から
1 => /dev/stdout
2 => /dev/stdout (= 1)
になって,>/dev/null は「1の出力先を /dev/null」にするから
1 => /dev/null
2 => /dev/stdout
になる.
>/dev/null で 1 と 2 が同時に /dev/null となることはない.
パイプは /dev/stdout の出力が次のコマンドの /dev/stdin になるので,
この場合は標準エラー出力だけパイプされる.
ちなみに &> /dev/null とすると「1と2の出力先を(同時に) /dev/null にする」
ことができる.man bash で RIDIRECTION のところ読め.
ありがとうございます。そっか、2>&1 を特別視してましたが
これも単なるリダイレクトなんですね。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.180s*