서브쉘 및 프로세스 교체

서브쉘 및 프로세스 교체

이것이 기본적인 질문이라면 사과드립니다. 저는 쉘 스크립트가 직접 ( shellScript.sh) 또는 를 사용하여 호출되는 방식에 따라 달라지는 더 큰 문제를 해결하려고 노력해 왔습니다 sh shellScript.sh.

문제의 모델은 다음과 같습니다.

Bash에서 실행할 때:

cat <(echo 'Hello')

출력이 보입니다.

Hello

하지만 내가 사용할 때 :

sh -c "cat <(echo 'Hello')"

오류가 표시됩니다.

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `cat <(echo 'Hello')'

탈출을 시도 하고 <, 다양한 조합으로 탈출을 시도했지만 어디에도 출력이 표시되지 않습니다. 내가 여기서 무엇을 놓치고 있는 걸까요?()

내 실제 문제는 <()쉘 스크립트 내의 Python 스크립트에 입력 인수로 a를 전달한다는 것입니다. 이름만 사용하여 쉘 스크립트를 호출하면 제대로 작동하지만 sh내가 사용하는 것과 비슷한 오류가 발생합니다. 위에 보여줬습니다.

감사합니다!

답변1

프로세스 교체는 1980년대 Korn 셸에서 시작된 기능입니다(ksh86에 처음 문서화됨). 당시에는 /dev/fd/<n>파일을 지원하는 시스템에서만 작동했습니다.

나중에 이 기능이 추가되었습니다 zsh(1990년부터) 및 bash(1993년부터). zsh이를 구현하기 위해 임시 명명된 파이프가 사용되고, 가능한 경우 로컬 및 기타 명명된 파이프가 bash사용됩니다 . /dev/fd/<n>1996년에 사용 가능한 곳 zsh으로 전환되었습니다 ./dev/fd/<n>2.6-beta17

/dev/fd명명된 파이프를 통한 시스템의 프로세스 교체 지원은 2012년에만 ​​추가되었습니다. 공개 도메인 복제본은 이를 지원하지 않습니다.kshksh93u+ksh

내가 아는 한, 다른 Bourne과 유사한 쉘은 이를 지원하지 않습니다( rcBourne 과 유사한 쉘 es이 아닌 fish다른 쉘은 이를 지원하지만 구문은 다릅니다). 구조 yash가 있지만 <(...)그건프로세스 리디렉션.

매우 유용하기는 하지만 이 기능은 POSIX에서 표준화된 적이 없습니다. sh따라서 에서 찾을 것으로 기대할 수 없으므로 sh스크립트에서 사용해서는 안 됩니다.

POSIX에서는 동작이 지정되지 않았지만 <(...)(그래서 유지해도 문제가 되지 않음) 해당 환경에서 bashas 또는 with를 호출하면 해당 기능이 비활성화됩니다.shPOSIXLY_CORRECT=1

따라서 이를 사용하는 스크립트가 있는 경우 , 또는 AT&T 와 <(...)같은 해당 기능을 지원하는 셸을 사용하여 해석해야 합니다 (물론 스크립트의 나머지 구문이 다음과 같이 해당 셸과 호환되는지 확인해야 합니다). 잘).zshbashksh

어떤 경우 에라도:

cat <(cmd)

다음과 같이 쓸 수 있습니다:

cmd | cat

그렇지 않으면

cmd

cat(인수로 제공된 파일을 통해 데이터를 전달해야 하는) 이외의 명령의 경우 다음을 사용하는 시스템에서 /dev/fd/x:

something | that-cmd /dev/stdin

또는 보존된 표준 입력이 필요한 경우 that-cmd:

{ something 3<&- | that-cmd /dev/fd/4 4<&0 <&3 3<&-; } 3<&0 

관련 정보