![프로세스가 대체한 파일 설명자를 변수에 넣습니다.](https://linux55.com/image/73965/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%80%20%EB%8C%80%EC%B2%B4%ED%95%9C%20%ED%8C%8C%EC%9D%BC%20%EC%84%A4%EB%AA%85%EC%9E%90%EB%A5%BC%20%EB%B3%80%EC%88%98%EC%97%90%20%EB%84%A3%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
다음과 같은 긴 명령이 있습니다.
$ command-outer "long command which references a file here: filename1, and another file reference here: filename2"
이 파일은 다른 명령의 출력입니다. 그래서 나는하고 있습니다 :
$ command-outer "long ... "<(command-inner "again long params")"... "\
<(command-inner "again long params")" ..."
<()
가독성을 위해 긴 명령 호출에서 이름이 지정되지 않은/익명 내부 파이프(파이프가 있는 파이프)를 추출 하고 싶습니다 . 하지만 다음을 수행할 수 없는 것 같습니다.
RESULT_FILE_DESCRIPTOR1=<(command-inner ....)
RESULT_FILE_DESCRIPTOR1
인수 목록에서 실제로 사용할 때 파일 설명자가 이미 닫혀 있는 결과가 발생했습니다.command-outer
command-outer
같은 회선으로 전화를 걸었으므로 다음과 같습니다 .
RESULT_FILE_DESCRIPTOR1=<(command-inner ....) outer-command "long ... $RESULT_FILE_DESCRIPTOR1 ... "
빈 결과 RESULT_FILE_DESCRIPTOR1이 반환되는데, 이는 다음과 같은 이유로 놀라운 일이 아닙니다.
FOO=BAR echo $FOO
작동하지 않습니다.
답변1
결과가 아닌 명령에만 이름을 지정할 수 있습니다.
param_set_1(){
input_command \
-lots \
-of \
-params
}
param_set_2(){
input_command \
-lots \
-of \
-other \
-params
}
command_outer -params <(param_set_1) <(param_set_2)
파일 설명자를 이름으로 참조할 수도 있습니다.
param_set_1 | { param_set_2 | command_outer -params /dev/fd/3 -; } 3<&0
현재 쉘 변수의 결과를 정말로 원한다면그리고파일 설명자에서는 파이프를 피해야 합니다. 해당 결과를 상위 쉘 변수에 할당하려고 시도하는 동안 명령의 출력으로 파이프 버퍼를 채울 위험이 있으며, 읽기 프로세스로 인해 파이프 버퍼가 소진될 수 있습니다... 음, 별로 좋지 않습니다. 따라서 모든 작업을 한 번에 수행하고 여기에 있는 설명서를 사용해야 합니다.
unset fd3 fd4
{ command_outer -params /dev/fd/[34]
} 3<<FD3 4<<FD4
${fd3=$(param_set_1)}
FD3
${fd4=$(param_set_2)}
FD4
답변2
명명된 파이프를 명시적으로 사용할 수 있습니다(프로세스 교체는 세부 사항에서 명명된 파이프를 사용한다고 생각합니다).
trap cleanup EXIT
cleanup() { rm -f "$inner1" "$inner2"; }
inner1=$(mktemp -u) && mkfifo "$inner1"
command-inner "again long params" > "$inner1" &
inner2=$(mktemp -u) && mkfifo "$inner2"
command-inner "again long params" > "$inner2" &
command-outer "long ... $inner1... $inner2 ..."