0

私はBashFAQ/002を読んでいて、次のリダイレクトのケースに遭遇しました。それぞれの場合について理解を書いておりますので、間違っている場合はコメントしてください。

ケース1

output=$(command 2>&1 >/dev/tty)

にリダイレクトstderrしてからstdoutにリダイレクトstdoutttyます。したがって、両方ともstdout and stderr端末にリダイレクト/出力します。

ケース2

output=$(command 2>&1 >/dev/null)

にリダイレクトstderrしてからstdoutにリダイレクトstdout/dev/nullます。stderr and stdout今は両方とも捨てられているので、これを行う意味はわかりませんが。

ケース3

output=$(command 3>&2 2>&1 1>&3-)

いいえ、ここで何が起こっているのか考えてください。私は気づいていませんfd 3

ケース4

exec 3>&1 
output=$(command 2>&1 1>&3)
exec 3>&-

いいえ、もう一度考えてください。

それで、誰かが私にケース#3とケース#4を詳細に説明し、関連するドキュメントを教えてもらえますか?

4

3 に答える 3

2

データを /dev/null に送信することは、結果を気にしないことを示します (たとえば、操作を実行したかっただけです)。

ケース 3 & 4: 開いている各ファイルにファイル記述子が割り当てられます。stdin、stdout、および stderr のファイル記述子は、それぞれ 0、1、および 2 です。追加のファイルを開くために、記述子 3 から 9 が残っています。http://www.tldp.org/LDP/abs/html/io-redirection.html

于 2012-10-20T08:03:37.570 に答える
2

ケース1と2は、あなたが説明したことをしません。どちらの場合も、stderrリダイレクトされるstdoutにリンクされていたものにリダイレクトされます。つまり、どちらの場合も、 に出力されたものを保存し、それぞれおよびにリダイレクトされます。(こちらおよび bash ドキュメントも参照してください) stdoutoutputcommandstderrstdout/dev/tty/dev/null

3単なる別のファイル記述子です。それについて「魔法」は何もありません。アプリケーション/コマンド/スクリプトがそれが何をするかを定義します。

-末尾にa がある形式については、 Bash ドキュメントの REDIRECTION and Moving File Descriptors、およびA Detailed Introduction to I/O and I/O Redirection を参照してください。

于 2012-10-20T08:04:54.647 に答える
1

2>&1は、stderr に stdout を複製していることを意味します。つまり、stdout が現在指している場所に stderr をリダイレクトしています (「stdout の場所」と呼ぶことでこれを単純化しましょう)。

このリダイレクトは、参照渡しではなく、値渡しに似ています。そのため、後で stdout をリダイレクトすると、stderr もリダイレクトされません。

説明すると、output=$(command 2>&1 >/dev/tty)

  • 2>&1stderr を stdout の場所にリダイレクトします。
  • >/dev/ttystdout を にリダイレクトし/dev/ttyますが、stderr は変更されません。

FD 3 ~ 9 は、必要に応じて使用できます。たとえば、他の FD の場所を一時的に保存したり、ファイルを指定したりできます。

ケース 3 では、stderr の場所と stdout の場所が切り替えられている間、FD3 を使用して stderr の場所を一時的に格納します。

:

  • 1>&3-FD3 の場所を stderr にコピーし、FD3 を閉じます
  • 3>&-FD3を閉じる

ケース 4 はケース 3 とほぼ同じです。exec 3>&1ケース 4 で使用されているように、現在のシェルの後続のすべてのコマンドに影響を与えます (で閉じられるまでexec 3>&-)、3>&1ケース 3 の はリダイレクトcommandのみに制限されます。

于 2012-10-20T09:28:30.370 に答える