예기치 않은 표시 '(' 근처에 구문 오류가 있습니다.

예기치 않은 표시 '(' 근처에 구문 오류가 있습니다.

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합니다 .ksh88ksh93

CentOS 시스템에서는 /bin/shyes 로 호출 /bin/bash하면 posix 모드(bashshbashBash 시작 파일 - sh라는 이름으로 호출됨). 5.1 이전의 bash 버전에서는프로세스 교체posix 모드에서 호출하면 지원이 비활성화되어 구문 오류가 발생합니다.

스크립트를 직접 호출하면 스크립트가 작동 합니다 bash. bash test.sh그렇지 않은 경우 bashposix 모드에 들어갔을 수 있습니다. bash매개변수를 사용하여 시작하거나 시작 시 변수를 설정하면 이런 --posix일이 발생할 수 있습니다 .POSIXLY_CORRECTbash

$ 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 -

-pastestdin에서 데이터를 읽도록 지시하는 표준 방법입니다. 표준은 아니지만 일부 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")'

관련 정보