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) 내부에 연결하기로 선택한 모든 명령은 내부에서 입력을 읽습니다.stdin
function1
stdin
function1
stdin
마찬가지로 of <( command2 "$OTHER_DETAILS" )
에 연결합니다 (스크립트 내의 함수라고 가정합니다). 누구나 코드 내에서 이와 같은 내용을 작성할 수 있습니다 .stdout
command2
echo
printf
stdout
command2
최종 결과는 stderr
if (2>) 내에서 실행된 코드가 if
스크립트 내의 다른 코드에 연결된다는 것입니다. 또한 의 출력 command2
도 내부 코드에 연결됩니다 if
(제공한 코드로 판단하면 코드는 command1이어야 함).
두 리디렉션 모두 다음 코드와 유사합니다(정확히 같지는 않음).
command2 | command1
command1 2>1 | function1