예기치 않은 토큰 근처에 구문 오류`< '

변수 a 및 b에 대한 명령의 출력을 읽는 스크립트 작성. 이것은 스크립트

#!/bin/bash read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) echo "The value of a is $a" echo "The value of b is $b" 

이며 구문 오류는 다음과 같습니다.

line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)" 

하지만 콘솔에 동일한 명령을 입력하면 아무런 문제없이 작동합니다.

app@user:/tmp> read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) app@user:/tmp> echo $a FAILED app@user:/tmp> echo $b STARTED 

이에 대한 모든 도움을 주셔서 감사합니다.

댓글

  • 스크립트에서이 동작을 재현 할 수 없습니다. 스크립트를 어떻게 호출합니까? 다음과 같이 호출합니다. $ ./script.sh
  • @Ketan sh script.sh로 호출합니다. 방금 ./script.sh를 사용해 보았고 원하는 결과를 얻고 있습니다. a의 값은 FAILED입니다. b의 값은 STARTED입니다. 응답 해주셔서 감사합니다 … sh file.sh와 ./file.sh를 사용하여 동일한 스크립트를 실행하는 동안 왜 다른지 알고 싶습니까 ??
  • sh ' 명령 대체를 허용하지 않습니다. bash script.sh로 호출 해보세요. ./script.sh에 의한 동일한 호출은 스크립트에서 / bin / ** bash ** 인 sha-bang로 실행됩니다.
  • @SudevJash 참조 : 스크립트를 실행하기 위해 ./와 sh의 차이점은 무엇입니까?
  • @Costas 예, 잘 작동합니다. bash script.sh 그리고 원하는 출력을 얻고 있습니다 … 감사합니다 …

답변

sh (대부분의 데비안 파생 시스템에서 dash에 연결됨)는 프로세스 대체 . bash script.sh로 호출을 시도합니다. ./script.sh에 의한 동일한 호출은 iv id = “31fc1b6989 인 sha-bang로 실행됩니다. 스크립트의 “>

/bin/bash

댓글

  • @MichaelDurrant 아, 이제 당신의 수정은 내가 말하려는 것과 반대되는 것을 의미합니다.
  • @muru 나는 수정을 받아 들일 수 없습니다 ' 티 o bash. 정확히 dash를 의미합니다. file $(which sh) 출력 /bin/sh: symbolic link to 'dash'
  • Costas, 그 ' 의미. Michael Durrant가 dashbash로 바꾸도록 수정했습니다. 수정 해 주셔서 감사합니다.
  • 명령 대체 ($(echo foo))가 아니라 프로세스 대체 (<( echo foo ))를 의미합니다. POSIX 사양의 일부입니다).
  • @chepner 맞습니다. 의견 감사합니다. 복구되었습니다.

Answer

스크립트를 sh file.sh로 호출하려고했는데 오류가 발생했습니다. . 그러나 ./file.sh 및 bash file.sh와 동일한 스크립트를 호출하면 작동하고 원하는 결과를 제공합니다.

답변

또한 스크립트 상단에 다음 줄을 간단히 추가 할 수 있습니다.

#!/bin/bash 

터미널 / 콘솔에 스크립트를 bash 스크립트로 실행하도록 지시하며 프로세스 대체 “<( cmd )“가 정상적으로 작동합니다.

댓글

  • OP '의 스크립트에는 이미 해당 shebang이 있지만 OP는 실행 중입니다. file.sh 또는 ./file.sh 대신 sh file.sh ( 자신의 답변 )

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다