프로세스가 대체한 파일 설명자를 변수에 넣습니다.

프로세스가 대체한 파일 설명자를 변수에 넣습니다.

다음과 같은 긴 명령이 있습니다.

$ 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 ..."

관련 정보