出力リダイレクトを理解しようとしていますが、問題が発生しています。私はその違いを本当に理解していないと思います。
1 > file # - redirect stdout to file (override mode)
1 >> file # - redirect stdout to file (append mode)
2 > 1 # 1) would that also redirect stderr to stdout, replacing stdout?
2 >> 1 # 2) would this redirect stderr to stdout (appending to it,
# i.e. haivng both sent to stdout?)
1>&9 # - duplicates stdout to file descriptor (pointer) 9
# 3) what's the difference of 2>&1 to a 2 >> 1? Does >> only run at the end
# of output?
echo foo > file # - redirects output to file (override mode)
>file 2>&1 # - duplicates stderr to stdout, then redirects to file in override mode
# 4) why is this giving me stdout, too, when the syntax is 2>&1,
# i.e. duplicate stderr into stdout - not merge 2 into 1?
&
アンパサンドはリダイレクトではなく複製を意味すると仮定します。しかし、(同じままですか?)a
にリダイレクトするのと(同じままですか?)にコピーすることの違いは何ですか?効果的にリダイレクトしてマージするようです。つまり、入るべきコンテンツが今そこにあるのですが…なぜでしょうか?b
a
a
b
a
b
2>&1
2
1
2
1
1
混乱しています...
答え1
まず何でも後ろに >
または>>
ファイル名> 1
なので1
。
例で提供されている他の形式の数字はファイル記述子です。デフォルトでは、プログラムは関連ファイル記述子0(標準入力)、1(標準出力)、および2(標準エラー)で始まります。インタラクティブシェルからプログラムを起動すると、これらのプログラムは端末の入力と出力(ユーザーはls -l /proc/$$/fd
Linuxで実行するとこれらの内容を見ることができます)。
前に数字を指定する>
か、作業するファイル記述子を指定してください。数字は記号の前になければなり>>
ません。だから>&
>
echo Example 2> stderr
「example」を印刷して空のstderr
ファイルを作成します(標準エラーで送信されたすべてのコンテンツを含む)。
ファイル記述子は、基本的にファイルを指すテーブルのエントリと考えることができます。
- 0分〜
/dev/tty
- 1分〜
/dev/tty
- 2分
/dev/tty
を指すようにファイル記述子1を更新するように指定します1> file
(または単純に)。切り捨てモードで開きます(該当する内容が置き換えられます)。ファイル記述子2が切り捨てモードで開かれた名前のファイルを指すように更新されることを指定します。> file
file
2> 1
1
>&
ファイル記述子をコピーする方法(またはこれが好ましい形式)を使用する場合は、&>
別のファイル記述子が指す項目を指すように1つのファイル記述子を更新するだけです。最後の例では、> file
ファイル記述子 1 が更新されました。
- 0分〜
/dev/tty
- 1分〜
file
- 2分
/dev/tty
次に、2>&1
ファイル記述子2を更新します。
- 0分〜
/dev/tty
- 1分〜
file
- 2分
file
(順序が重要です。上記を> file 2>&1
作成すると、2>&1 > file
ファイルディスクリプタ1だけが最終的にリダイレクトされます。)
この1>&9
形式は、ファイル記述子9が開いている場合にのみ有効です。例えばファイル記述子1をここにコピーするか(9>&1
)ファイルを開きます(9> file
)。このタイプの設定は、リダイレクトされたときにファイル記述子の元の内容を追跡するのに役立ちます。したがって、スクリプトから1と2を安全にコピーし、stdoutとエラーを必要な目的にリダイレクトして復元できます。
これバッシュマニュアルすべての詳細があります。
答え2
いくつかの間違った仮定があります。
リダイレクトの一般的な構文は次のとおりです。
[n]redirection-operator word
ここでn
ファイル記述子を表す 10 進数です。との間にスペースはn
ありませんredirection-operator
。
標準出力をファイルにリダイレクトするには、次のものが必要です。
> file
または:
1> file
1 > file
コマンドを実行し1
て出力をにリダイレクトfile
するか、明示的に次のようになります。
1 1> file
2> file
標準エラーと演算子も同じです>>
。
ファイル記述子をコピーするには、次のようにします。
[n]<&word
入力ファイル記述子用[n]>&word
出力ファイル記述子の場合[n]<>word
読み書きするためにファイル記述子を開きます。
上記の構文はすべて標準構文で、スクリプトで使用すると#!/bin/sh
機能します。
一部のシェルには、標準出力と標準エラーをリダイレクトし、コマンドのbash
完了時にオフセットに切り捨てるなどの独自の拡張機能があります。>&
ksh93
<>;
これで違いを見ることができます。
これコピー演算子はファイル記述子でのみ機能しますが、リダイレクトOperatorはファイル(後でファイル記述子にマップされている)に対してのみ機能します。