임시 파일을 사용하지 않고 하위 프로세스에서 지연된 stdout을 어떻게 구현할 수 있나요?

임시 파일을 사용하지 않고 하위 프로세스에서 지연된 stdout을 어떻게 구현할 수 있나요?

middle수정할 수 없는 프로그램(이름을 지정하겠습니다)이 있습니다.
프로그램은 다음과 같은 일련의 단계를 수행합니다.

  • middle일부 텍스트를 stdout으로 보내기( echo Text1)
  • middleinner.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$innermiddle저장됨fd 4의 원시 표준 출력. fd 4가 목적을 달성한 후에는 middle어떤 조치도 수행할 필요가 없으므로 종료합니다 .

관련 정보