Bashの出力リダイレクト - >>と>&、リダイレクトとコピーの違いは何ですか?

Bashの出力リダイレクト - >>と>&、リダイレクトとコピーの違いは何ですか?

出力リダイレクトを理解しようとしていますが、問題が発生しています。私はその違いを本当に理解していないと思います。

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にリダイレクトするのと(同じままですか?)にコピーすることの違いは何ですか?効果的にリダイレクトしてマージするようです。つまり、入るべきコンテンツが今そこにあるのですが…なぜでしょうか?baabab2>&121211

混乱しています...

ベストアンサー1

まず何でも後ろに >または>>ファイル名> 1なので1

例で提供されている他の形式の数字はファイル記述子です。デフォルトでは、プログラムは関連ファイル記述子0(標準入力)、1(標準出力)、および2(標準エラー)で始まります。インタラクティブシェルからプログラムを起動すると、これらのプログラムは端末の入力と出力(ユーザーはls -l /proc/$$/fdLinuxで実行するとこれらの内容を見ることができます)。

前に数字を指定する>か、作業するファイル記述子を指定してください。数字は記号の前になければなり>>ません。だから>&>

echo Example 2> stderr

「example」を印刷して空のstderrファイルを作成します(標準エラーで送信されたすべてのコンテンツを含む)。

ファイル記述子は、基本的にファイルを指すテーブルのエントリと考えることができます。

  • 0分〜/dev/tty
  • 1分〜/dev/tty
  • 2分/dev/tty

を指すようにファイル記述子1を更新するように指定します1> file(または単純に)。切り捨てモードで開きます(該当する内容が置き換えられます)。ファイル記述子2が切り捨てモードで開かれた名前のファイルを指すように更新されることを指定します。> filefile2> 11

>&ファイル記述子をコピーする方法(またはこれが好ましい形式)を使用する場合は、&>別のファイル記述子が指す項目を指すように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とエラーを必要な目的にリダイレクトして復元できます。

これバッシュマニュアルすべての詳細があります。

おすすめ記事