예기치 않은 토큰`( '근처의 구문 오류


15

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")

이 문제를 어떻게 해결할 수 있습니까?


정확히 어떻게 운영하고 있습니까? 뭐 '#!' line (있는 경우)이 스크립트를 시작합니까? 해당 구문을 지원하지 않는 쉘 인터프리터를 호출하는 것 같습니다 (예 : dash대신 bash).
스틸 드라이버

나는 #!/bin/sh정상에있다. 나는 실행 bash test.sh했지만 작동하지 않았다.
NecNecco

bashPOSIX 모드에서는 ( --posix또는로 호출 할 때) 해당 구문을 지원하지 않습니다 /bin/sh. 사용하십시오 #!/bin/bash.
jordanm

@NecNecco : POSIXLY_CORRECT시작할 때 변수가 설정되어 bash있습니까?
cuonglm

@jordanm #!/bin/bash상단으로 전환 하면 문제가 해결되었습니다.
NecNecco

답변:


23

공정 대체는 그래서 모든 POSIX 쉘은 같은 일부 껍질을 지원하지, POSIX에 의해 지정되지 않은 bash, zsh, ksh88, ksh93지원.

에서 Centos시스템 /bin/sh에 심볼릭 링크입니다 /bin/bash. 때 bash이름으로 호출 sh, bashPOSIX 모드 (입력 배쉬 시작 파일 - 이름 SH으로 호출 ). posix 모드에서 process substitution지원되지 않으므로 구문 오류가 발생합니다.

bash직접 전화하면 스크립트가 작동 합니다 bash test.sh. 그렇지 않은 경우 bashposix 모드로 전환되었을 수 있습니다. 당신이 시작하는 경우이 문제가 발생할 수 있습니다 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 -

-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")'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.