40

与えられたシェルスクリプト:

#!/bin/sh

echo "I'm stdout";
echo "I'm stderr" >&2;

コマンドの最後の部分が2>/dev / nullの場合、stderrのみが出力されるようにそのスクリプトを呼び出す方法はありますか?

$ > sh myscript.sh SOME_OPTIONS_HERE 2>/dev/null
I'm stderr

または、代わりに:

$ > sh myscript.sh SOME_OPTIONS_HERE >/dev/null
I'm stdout

一連の講義スライドの最後にある質問ですが、これで1日近く作業した後、それはある種のタイプミスであるとほぼ確信しています。ピボットは機能しません。2>&-は機能しません。アイデアが足りません!

4

4 に答える 4

50
% (sh myscript.sh 3>&2 2>&1 1>&3) 2>/dev/null
I'm stderr
% (sh myscript.sh 3>&2 2>&1 1>&3) >/dev/null 
I'm stdout

の説明3>&2 2>&1 1>&3:

  • 3>&2fd 3 (ファイル記述子 3) という名前のファイル記述子 2 (fd 2) (stderr)のコピーを作成することを意味します。ファイル記述子をコピーしますが、ストリームを複製しませんtee
  • 2>&1fd 2 ofsh myscript.shが fd 1 (stdout) のコピーになることを意味します。ここで、myscript が stderr (fd 2) に書き込むと、stdout (fd 1) で受け取ります。
  • 1>&3sh myscript.shの fd 1が fd 3 (stderr) のコピーになることを意味します。ここで、myscript が stdout (fd 1) に書き込むと、stderr (fd 2) で受け取ります。
于 2012-11-08T22:59:10.447 に答える