メモの日々


2011年11月16日(水) [長年日記]

[shell][howto] 標準出力と標準エラーを入れ替える

に、

$ command 3>&2 2>&1 1>&3

というイディオムが紹介されていた。これでcommandの標準出力と標準エラーが入れ替わる。

動作確認。

% bash

$ ls
tmp/

$ ls tmp tmp2
ls: tmp2: そのようなファイルやディレクトリはありません
tmp:

$ ls tmp tmp2 3>&2 2>&1 1>&3 | sed 's/tmp/XXX/'
tmp:
ls: XXX2: そのようなファイルやディレクトリはありません

標準エラーに対してだけ置換が行われたのでOK。ちなみに、zsh 4.2.0(古い)だとうまくいかなかった。

[shell][howto] 標準エラーだけを操作する

上のようにすれば標準エラーだけをパイプに渡せるけど、標準出力と標準エラーが入れ替わってしまう。標準出力は維持し、標準エラーに対してだけ置換を行った結果を標準エラーに出力して欲しい。

上のようにした後でもう一度入れ替えればいいはず。

$ (ls tmp tmp2 3>&2 2>&1 1>&3 | sed 's/tmp/ttt/') 3>&2 2>&1 1>&3 | sed 's/t/X/'
ls: ttt2: そのようなファイルやディレクトリはありません
Xmp:

もっと簡単にやる方法あるのかな?