Bashのif文リダイレクトを理解する

Bashのif文リダイレクトを理解する
if [ -z "$OPTION" ] # if option is not given(empty) then:
    then
        command1 --defaultOption
    else 
        command1 $OPTION
fi \
  2> >( function1 "$DETAILS" ) \
  < <( command2 "$OTHER_DETAILS" )

私はstderrをファイルとして指定し、stdinにファイルを入力してif文と対話する方法について非常に混乱しています。よく知られているものは次のとおりです。 2>filename# Redirect stderr to file "filename." 2>>filename# Redirect and append stderr to file "filename." command < input-file > output-file < input-file command > output-file

私の推測は次のとおりです

command2 は、--defaultOption ($OPTION が空の場合) を使用して command1 の標準入力に渡すか、または $OPTION ($OPTION が空でない場合) を使用して command1 の標準入力に渡すファイルを生成します。 command1のstderrはfunction1にリダイレクトされます(たとえば、進行状況バーの一種の表示など)。

だから私の質問は次のようになります

かっこ< <の間にスペースが> >必要ですか?実際に追加されましたか(空白を無視)、それとも「二重」リダイレクトですか?括弧と中括弧の間の相互作用が>(ありませんか<(?どのようにしてif評価に影響しますか?それとも-z $OPTIONテストしたばかりですか?

command2の出力ファイルをディスクに書き込んでから、オプションを確認してif文で再度読み込むと、何が起こっているのかをよりよく理解できますか?

command2 "$OTHER_DETAILS" --out=file.txt
if [ -z "$OPTION]
  then
    command1 --defaultOption --in=file.txt 2>function1
  else
    command1 "$OPTION" --in=file.txt 2>function1
fi

これは私が見つけたスクリプトの一部です。 http://linuxtv.org/wiki/index.php/V4L_capturing/script (912号線~924号線)

ベストアンサー1

<(cmd)シェル構文(プロセス置換と呼ばれる)です>(cmd)。これはファイルパスに置き換えられます。

cmd1 <(cmd2)

~になる

cmd1 /path/to/file

ファイルの内容は出力なcmd2ので、読み取ることができ、書き込むことはできません。一例:

start cmd:> ls -l <(echo foo)
lr-x------ 1 hl hauke 64  5. Jan 03:49 /dev/fd/63 -> pipe:[3125128]

この場合、引数lsと見なされます。/dev/fd/63あなたの場合、このパスはリダイレクトの一部になります。したがって、スペースは必須です。> >(cmd)「stdoutを内容がcmdに入力される一時ファイルにリダイレクトする」ことです。これはファイルと見なされるため、>>(cmd)シェルが「有効」である必要があるため、エラーが発生します>>>>'(cmd)'(cmd)

start cmd:> echo foo >>'(cat)'

start cmd:> cat \(cat\) 
foo

おすすめ記事