出力を2>&1および1>&2にリダイレクトするのはなぜですか?


36

私はいくつかのコマンド間でその使用を歩んでいる2>&11>&2、私はかなりそれを使用して、私はそれを使用しなければならないときの目的のまわりで私の頭を取得することはできません。

私が理解していること

これ1は標準出力を2表し、標準エラーを表します。to 2>&1の出力と2to の出力の組み合わせを理解しています1

私が手に入らないもの

  1. いつ使用すべきですか?
  2. どんな目的に役立ちますか?

回答:


39

stdout stderrの両方を同じ場所にリダイレクトしたい場合があります。これ>&が使用されるのは、あるファイル記述子を別のファイル記述子に向ける場合です。


たとえば、stdoutとstderrの両方を同じファイル(/dev/nullまたはit output.txt)に書き込みたい場合は、次のように別々にリダイレクトできます。

app 1>/dev/null 2>/dev/null

または、1つのファイル記述子をファイルにリダイレクトし、他のファイル記述子を最初のファイル記述子にリダイレクトすることもできます。

app 1>/dev/null 2>&1

app 2>/dev/null 1>&2

最初の例では、2>&1ファイル記述子#2が#1がすでに指している場所を指します。2番目の例でも同じことが達成され、代わりにstderrで開始されます。

別の例として、stdout(ファイル記述子#1)がすでに目的の場所を指しているが、名前で参照できない場合があります(パイプ、ソケットなどに関連付けられている場合があります)。これは、通常、stdoutのみをキャプチャするプロセス拡張(` `またはor $( )演算子)を使用するときによく起こりますが、stderrを含めることもできます。この場合、>&stderrをstdoutに向けるためにも使用します。

out=$(app 2>&1)

別の一般的な例はページャー、またはgrep、または同様のユーティリティです。パイプ|は通常stdoutでのみ機能するため、パイプを使用する前にstderrをstdoutにリダイレクトします。

app 2>&1 | grep hello

2>&1どちら1>&2が正しいかを知る方法は?すでに設定ファイルディスクリプタは、右に行く>&と、リダイレクトするファイルディスクリプタは、左に行きます。(2>&1「ファイル記述子#2をファイル記述子#1にポイント」を意味します。)


一部のシェルには、一般的なリダイレクトのショートカットがあります。Bashの例を次に示します。

  • 1> 短くすることができます >

  • 1>foo 2>&1>&fooたり&>foo

  • 2>&1 | program|& program


app 1>/dev/null 2>&12>&1が1がすでにリダイレクトしているファイルを指すことを意味するとは思いもしませんでした。簡単にできると思いapp > /dev/null &>ますか?
PeanutsMonkey

私は理解に苦労していますthe already set up fd goes to the right of >&, and the fd you want to redirect goes to the left。既にセットアップされたファイル記述子とはどういう意味ですか?それは何の権利を意味しますか?
PeanutsMonkey


あなたが私に方向を教えるつもりでない限り申し訳ありませんが、私はあなたが以前に述べたようにした声明に従いません。
PeanutsMonkey

1
各ファイル記述子を左から右に一度に1つずつリダイレクトし、それらのルールをその順序で適用します。あなたの場合は最初のファイルへの直接STDOUT、そして私たちが今指して標準出力場所へのリダイレクト標準エラー出力は、その後、標準エラー出力と標準出力は、同じファイルに移動します。これらの2つのリダイレクトを入れ替えると、異なる結果が得られます(stderrをstdoutが現在行っている場所にリダイレクトし、stdoutが別のファイルを指すように移動しますが、stderrはポイントされた場所で続行します)。
ジェイソン

2

必要な状況の1つstraceは、ページャーで出力を表示する場合です。strace出力を標準エラーに出力し、パイプは通常標準出力を標準入力に接続するため、リダイレクトを使用する必要があります。

strace -p $pid 2>&1 | less

どういう意味pipes generally connect standard output to standard inputですか?
PeanutsMonkey

2
つまり、パイプ(|)は最初のコマンドの標準出力を取得し、2番目のコマンドの標準入力に接続します。
ジャパレセク

2

stdout1)とstderr2)の両方を同じ場所(/dev/nullなど)にリダイレクトしたい場合があります。これを達成する1つの方法は次のとおりです。

$ program 1>/dev/null 2>/dev/null

しかし、ほとんどの人は、にリダイレクトstderrstdoutてこれを短縮し2>&1ます:

$ program 1>/dev/null 2>&1

さらに短いバージョンは次のとおりです。

$ program >&- 2>&-

1

2:これは、標準エラーと標準出力の両方からの出力があり、それらを単一の文字列に構成する場合に使用します。

1:標準エラーと標準出力の両方の出力を操作する場合。


操作とはどういう意味ですか?私の理解では、リダイレクトされたもの>2はすべて/ dev / nullに送信されます。または、私は完全に間違っていますか?
PeanutsMonkey

それは正しくありません。操作とは、grepなどにパイプすることを意味します。例についてはこちらをご覧ください。
-soandos

0

私はそれを使用して分離ジョブを開始します:

someProgram 2>&1 >& my.log &

その後、ログアウトできますが、someProgramは引き続き実行されます。この機能は、GNU Screen、tmux、および他のいくつかのプログラムによって提供されますが、ここでは外部の依存関係なしで実現されます。


1
これは、プログラムにSIGHUPが送信されない限り機能します。より良い使用nohupまたはdisownそのような場合。
slhck

@slhck:わかった。しかし、プログラムにSIGHUPを送信しなかった場合、誰もそうしませんか?
アドビ

いいえ、制御端末はSIGHUPを使用してログアウトのプロセスに警告します。実際には、SSHを介してリモートシェルを実行して終了すると、たとえばプロセスも停止します。
slhck

@slhck:真実ではない:数年使用しています-sshからログアウトしましたが、プロセスはまだ実行中です。
アドビシステムズ社

これをより詳細に調べる必要がありますが、プログラムをバックグラウンドに置くだけではすべてのケースで機能するわけではなく、ローカルマシンでも機能しません。ZshとBashの動作はここでも異なっているようです。
-slhck

0

try次の3つのファイルを含む名前のディレクトリがあると想像してください。file file1 and file2.

次のコマンドを実行します。

cat file file1 file2 file3

最初の3つのファイルは開きますがcat、4番目のファイルは存在しないため、開くときにエラーがスローされます。

今実行してください:

cat file file1 file2 file3 1>outfile 2>&1

あなたは、画面上の任意の出力が表示されません。第一1>outfileに、コマンドの出力をリダイレクトしますoutfileし、それが(リダイレクトされます2>&1)をオープンしようとしてエラーがスローfile3outfile

1>&2 同様に機能し、エラーストリームを標準出力にリダイレクトします。

お役に立てれば!


0

代替シナリオ:端末コマンドは別の端末への出力を表示します

tty各ターミナルでコマンドを使用して、それらを識別します。

$ tty
/dev/pts/0

$ tty
/dev/pts/1

これらのTTYを想定して、最初の標準出力を2番目にリダイレクトするには、最初の端末でこれを実行します。

exec 1>/dev/pts/1

注:これで、すべてのコマンド出力がpts / 1に表示されます。

pts / 0のデフォルトの動作stdoutを復元するには:

exec 1>/dev/pts/0

デモについては、このビデオを参照してください。


0

stderrをstdoutにリダイレクトする場合については、すでにここで説明しています(たとえば、エラーメッセージのフィルタリング(grep)に使用します)。

もう1つのケースは、stdoutをstderrにリダイレクトすることです。(少なくとも私にとって)一般的なユースケースは、(シェルスクリプトで) "echo"で印刷された警告/エラーメッセージをstderrに送信することです(これにより、ユーザーの注意をより簡単につかむことができます)。

例えば、

echo "file \"${file\" does not exist..." 1>&2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.