このコマンドのリダイレクトを理解していますか? [コピー]

このコマンドのリダイレクトを理解していますか? [コピー]

魔法の命令を見つけました。ここ

./my.sh 3>all 1> >(tee out >&3) 2> >(tee err >&3)

私が混乱している場所があります。

  1. 3>allfileにファイル記述子3を設定することを意味しますかall
  2. 何をすべき1> >ですか2> >?私の理解によると、コマンドはでなければなりませ./my.sh 3>all 1>(tee out >&3) 2>(tee err >&3)んが、うまくいきません。
  3. (tee err >&3)ファイルを上書きしないのはなぜですかall

これは私のものです。my.sh

#!/bin/bash

echo myecho
ls dflj

ベストアンサー1

Bashのマニュアルページでこの構文を読むことができます。プロセスの置き換え:

>(list)。プロセスリスト実行されると、その出力は/ dev / fdのファイルにリンクされます。ファイル名は、拡張結果として現在のコマンドに引数として渡されます。

このコマンドの出力を見ると、リダイレクトは行われません。

echo >(echo hi >/tmp/a) >(echo lo >/tmp/b)

それは(私のシステムで):

/dev/fd/63 /dev/fd/62

したがって、and1> >(...)で読む必要があります。 2番目の部分はで置き換えられ、次にstdoutをファイル記述子63にリダイレクトします。 1>>(...)/dev/fd/631> /dev/fd/63

bashは別のプロセスでコマンドを実行し、>(...)そのプロセスの標準入力をファイル記述子63に接続します。次の例を確認してください。

set -x
echo hello > >(cat -n)

Echoの標準出力は入力として接続され、次のようになりcat -nます。

+ echo hello
++ cat -n
 1  hello

おそらくあなたが逃しているのはファイル記述子(fd)がファイルの場合クロスプロセス(bashが使用するプロセス>(...))を使用すると、新しいプロセスから同じfdを継承できます。したがって、これら2つのプロセスは同じfdを共有します。それにちょうど一つあります。ファイルオフセットfdの場合、プロセス1がfdに3文字を書き込むと、オフセットは0から3に移動します。プロセス2がfdに5文字を書き込むと、データはオフセット3に配置され、オフセットは8になります。プロセス2 1が別の文字を書き込むと、オフセット8に配置されます。これは、あなたの質問のtee2つのコマンドがall互いに上書きせずに同じファイルに書き込む方法です。

を使用すると、>&3新しいfdは生成されません。単に現在のstdout fd 1を閉じてから、fd 3の番号をfd 1に戻します。したがって、各プロセスに異なる数字が表示されていても(man dup2基本システムコールを参照)、両方のプロセスに対してまだ1つのfdしかありません。

おすすめ記事