middle
수정할 수 없는 프로그램(이름을 지정하겠습니다)이 있습니다.
프로그램은 다음과 같은 일련의 단계를 수행합니다.
middle
일부 텍스트를 stdout으로 보내기(echo Text1
)middle
inner.sh
일부 텍스트 문자열(4KB 이하)을 인수(inner.sh "Deferred Message"
) 로 전달하여 쉘 스크립트를 호출합니다.middle
일부 텍스트를 stdout으로 보내기(echo Text2
)
내 임무는 두 개의 bash 스크립트를 생성 outer.sh
하고 inner.sh
프로세스에서 생성된 다른 모든 메시지 이후에 지연된 메시지를 예약하는 것입니다 middle
.
생성된 표준 출력은 다음과 같아야 합니다.
Text1
Text2
Deferred Message
필요하다:
outer.sh
호출되어야 합니다middle
(middle
그리고 호출될 것입니다inner.sh
).inner.sh
해당 매개변수는 어딘가에 기억되어야 합니다(지연된 메시지).middle
종료 후에는outer.sh
지연된 메시지를 호출하여 표준 출력으로 인쇄해야 합니다.- 동시에 실행되는 프로세스가 많이 있을 것입니다
outer.sh
. 지연된 메시지는outer.sh
현재 프로세스 인스턴스에 로컬로 저장되어야 합니다. - 파일 시스템에서 임시 개체 생성을 허용하지 않습니다. (지연된 메시지를 메모리 어딘가에 저장할 수 있습니까?)
내부.sh
# Where should I save message "$1"?
외부.sh
middle "$@"
# How should I recall and print the deferred message?
하위 프로세스에서 지연된 메시지를 어디에 저장해야 하며 상위 프로세스에서 어떻게 읽을 수 있습니까?
답변1
inner.sh
가능한:
printf '%s\n' "$1" >&3
에서는 outer.sh
다음을 수행할 수 있습니다.
{ inner=$(middle "$@" 3>&1 >&4 4>&-); } 4>&1
printf '%s\n' "$inner"
내부 텍스트는 파이프로 연결되어(명령 대체) 쉘 변수에 저장됩니다. middle
호출하기 전에 fd 3이 닫히지 않을 것이라고 가정합니다 inner.sh
(그러나 그렇게 할 이유는 없습니다).
설명하다:
{ ... } 4>&1
. 이 명령 그룹에서 처음에 fd 1과 4는 모두 원시 stdout을 가리킵니다. IOW, 명령 대체에서 복원할 수 있도록 outer.sh의 stdout을 fd 4에 복사했습니다.$(...)
. 이 명령 대체에서 stdout(fd 1)은 파이프입니다. 이것이 명령 대체의 요점입니다. 명령의 출력을 가져오려고 합니다. 하지만 여기서 우리는 stdout을 원하지 않고 그것(또는 그것의 자식 )이 fd 3에 쓰는middle
것을 원합니다 .inner.sh
middle 3>&1 >&4 4>&-
:For , 우리는 작성된 내용이 들어가middle
도록 cmdsubst 파이프에 fd 3을 설정한 다음 stdout을 다음으로 복원합니다.inner.sh
$inner
middle
저장됨fd 4의 원시 표준 출력. fd 4가 목적을 달성한 후에는middle
어떤 조치도 수행할 필요가 없으므로 종료합니다 .