CentOS의 SSH 터미널에서 다음 코드를 사용하면 제대로 작동합니다.
paste <(printf "%s\n" "TOP")
하지만 동일한 코드 줄을 쉘 스크립트(test.sh)에 넣고 터미널에서 쉘 스크립트를 실행하면 아래와 같이 오류가 발생합니다.
./test.sh: line 30: syntax error near unexpected token ('
./test.sh: line 30: paste <(printf "%s\n" "TOP")
이 문제를 어떻게 해결할 수 있나요?
답변1
프로세스 대체POSIX가 지정되지 않았으므로 모든 POSIX 쉘이 이를 지원하는 것은 아니며 , , , 와 같은 일부 bash
쉘만 지원 zsh
합니다 .ksh88
ksh93
CentOS 시스템에서는 /bin/sh
yes 로 호출 /bin/bash
하면 posix 모드(bash
sh
bash
Bash 시작 파일 - sh라는 이름으로 호출됨). 5.1 이전의 bash 버전에서는프로세스 교체posix 모드에서 호출하면 지원이 비활성화되어 구문 오류가 발생합니다.
스크립트를 직접 호출하면 스크립트가 작동 합니다 bash
. bash test.sh
그렇지 않은 경우 bash
posix 모드에 들어갔을 수 있습니다. bash
매개변수를 사용하여 시작하거나 시작 시 변수를 설정하면 이런 --posix
일이 발생할 수 있습니다 .POSIXLY_CORRECT
bash
$ bash --posix test.sh
test.sh: line 54: syntax error near unexpected token `('
test.sh: line 54: `paste <(printf "%s\n" "TOP")'
$ POSIXLY_CORRECT=1 bash test.sh
test.sh: line 54: syntax error near unexpected token `('
test.sh: line 54: `paste <(printf "%s\n" "TOP")
또는 옵션 bash
으로 제작되었습니다 --enable-strict-posix-default
.
여기서는 프로세스 대체가 필요하지 않으며 표준 쉘 파이프를 사용할 수 있습니다.
printf "%s\n" "TOP" | paste -
-
paste
stdin에서 데이터를 읽도록 지시하는 표준 방법입니다. 표준은 아니지만 일부 paste
구현에서는 생략할 수 있습니다.
이는 여러 명령의 출력을 붙여넣을 때 유용할 수 있습니다. 예를 들면 다음과 같습니다.
paste <(cmd1) <(cmd2)
지원되는 시스템에서는 /dev/fd/n
다음을 수행할 수 있습니다 sh
.
{ cmd1 4<&- | { cmd2 3<&- | paste /dev/fd/3 -; } 3<&0 <&4 4<&-; } 4<&0
(이것이 <(...)
내부에서 하는 일입니다.)
답변2
또 다른 해결 방법이 있습니다. 해당 명령을 실행하는 대신 bash를 실행하고 -c를 사용하여 명령을 bash에 전달하십시오.
bash -c 'paste <(printf "%s\n" "TOP")'