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

답변2

A는 >( )"파일 위치"에서 일부 코드나 함수를 대체하는 "프로세스 대체"라는 관용어입니다.

연결 >( function1 "$DETAILS" )중입니다. 이름으로 볼 때 function1은 사용/읽고 있는 스크립트(함수를 사용하기 전에 읽은 코드)에 이미 정의된 함수라고 가정합니다. (여러 번 cat) 내부에 연결하기로 선택한 모든 명령은 내부에서 입력을 읽습니다.stdinfunction1stdinfunction1stdin

마찬가지로 of <( command2 "$OTHER_DETAILS" )에 연결합니다 (스크립트 내의 함수라고 가정합니다). 누구나 코드 내에서 이와 같은 내용을 작성할 수 있습니다 .stdoutcommand2echoprintfstdoutcommand2

최종 결과는 stderrif (2>) 내에서 실행된 코드가 if스크립트 내의 다른 코드에 연결된다는 것입니다. 또한 의 출력 command2도 내부 코드에 연결됩니다 if(제공한 코드로 판단하면 코드는 command1이어야 함).

두 리디렉션 모두 다음 코드와 유사합니다(정확히 같지는 않음).

command2     | command1
command1 2>1 | function1 

관련 정보