이것이 기본적인 질문이라면 사과드립니다. 저는 쉘 스크립트가 직접 ( 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년에만 추가되었습니다. 공개 도메인 복제본은 이를 지원하지 않습니다.ksh
ksh93u+
ksh
내가 아는 한, 다른 Bourne과 유사한 쉘은 이를 지원하지 않습니다( rc
Bourne 과 유사한 쉘 es
이 아닌 fish
다른 쉘은 이를 지원하지만 구문은 다릅니다). 구조 yash
가 있지만 <(...)
그건프로세스 리디렉션.
매우 유용하기는 하지만 이 기능은 POSIX에서 표준화된 적이 없습니다. sh
따라서 에서 찾을 것으로 기대할 수 없으므로 sh
스크립트에서 사용해서는 안 됩니다.
POSIX에서는 동작이 지정되지 않았지만 <(...)
(그래서 유지해도 문제가 되지 않음) 해당 환경에서 bash
as 또는 with를 호출하면 해당 기능이 비활성화됩니다.sh
POSIXLY_CORRECT=1
따라서 이를 사용하는 스크립트가 있는 경우 , 또는 AT&T 와 <(...)
같은 해당 기능을 지원하는 셸을 사용하여 해석해야 합니다 (물론 스크립트의 나머지 구문이 다음과 같이 해당 셸과 호환되는지 확인해야 합니다). 잘).zsh
bash
ksh
어떤 경우 에라도:
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