쉘 스크립트 실패 : 구문 오류 :“(”예기치 않은


64

나는 Raspberry Pi 개발을위한 개발 환경 설정을 자동화하는 스크립트를 작성했습니다 (단계별 세부 정보는 여기에 있습니다 ). 이 기사에는 스크립트가 연결되어 있지만 편의상 여기 에서도 찾을 수 있습니다 . 이제이 스크립트를 설치하고 오류없이 환경을 설정할 때 기본적으로 sudo의 시간 종료 값으로 인해 sudo 비밀번호를 두 번 이상 입력해야합니다. 그래서 모든 sudo 줄을 제거하고 sudo를 통해 명령 줄에서 전체 스크립트를 실행하여 실험을 시작했습니다.

kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh

이것은 예상대로 잘 작동 하며이 시점까지 대부분의 길을 통과합니다.

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

이제이 줄은 sudo로 전체 스크립트를 실행하지 않을 때 이전에 정상적으로 작동했습니다. 이 라인에 대해 sudo로 실행되는 것이 내 지식에 영향을 미치지 않아야한다고 생각합니다. 아무도 아이디어가 있습니까?


1
shebang은 정말 9 행에 있습니까? 우분투의 DashAsBinSh 선호도 로 인해 스크립트가 dash대신에 해석되는 것 같습니다 bash. 1 번 라인에서 shebang을 움직여보십시오.
manatwork

이 기사에 따르면 / bin / sh 대신 / bin / bash를 직접 호출하면됩니다. 내가 이해하는 것처럼 문제가되지 않도록 대시 대신 bash를 올바르게 사용하십시오. 나는 여전히 shebang을 움직일 수 있지만, 전체 스크립트를 sudo하지 않을 때 왜 그것이 작동하는지에 대해서는 설명하지 않습니다.
kemra102

제 경우에는 모든 것이 좋았지 만 습관으로 "bash"가 아닌 "sh"로 쉘 스크립트를 실행했습니다.
Indrajeet Gour

답변:


82

스크립트는 shebang 행으로 시작하지 않으므로 시스템은로 시작합니다 /bin/sh. 우분투에서 /bin/sh입니다 대시 만 표준 기능의 빠른 시작 및 실행을 위해 설계된 쉘. 대시가 68 행에 도달하면 구문 오류가 나타납니다. 괄호는 문맥 상 아무런 의미가 없습니다.

대시 (다른 모든 쉘과 마찬가지로)는 인터프리터이므로 실행이 문제가있는 행에 도달 할 때까지 불평하지 않습니다. 따라서 테스트 중 어느 시점에서 스크립트가 성공적으로 시작 되더라도 68 행에 도달하면 스크립트가 중단됩니다.

shebang 줄은 파일에서 가장 먼저해야합니다. bash 기능을 사용하므로 파일의 첫 번째 행은 #!/bin/bash또는 이어야합니다 #!/usr/bin/env bash.


2
내 지식의 차이에 분명히 감사합니다. 많이 스크립트하지 않았으므로 그것을 알지 못했습니다! 설명에 감사드립니다. 많은 도움이되었으며 앞으로도 알게 될 것입니다.
kemra102

노틸러스 용 스크립트 확장을 사용하는 중에도이 오류가 발생한다고 덧붙입니다. shebang 라인을 추가하면 즉시 해결되었습니다. +1.
Bhavin Doshi

sonarqube.sh우분투 15.10에서 실행중인 문제에 직면 . 말한대로 헤더를 변경했습니다. 실행 중 sudo sh ./sonar.sh console입니다. 여전히 오류가 발생합니다.
soufrk

그것은 @soufrk가 sonarqube.shsonar.sh? 당신의 마음을 구성하십시오. 어쨌든이 스레드의 정보로 문제를 해결할 수 없으면 스크립트의 전체 내용으로 새로운 질문을하고 전체 오류 메시지를 복사하여 붙여 넣습니다.
Gilles

내 잘못이야 !! 잘못된 아치 실행 파일을 실행 중입니다. 그러나 흥미롭게도 올바른 아치에서 파일은 #! /bin/sh완벽하게 실행됩니다. 자, 그게 날 의아해합니다.
soufrk

6

shebang이 첫 번째 행에 없으면 루트 사용자의 쉘, SHELL변수 또는 -s플래그에 관계없이 존중되지 않습니다 . 간단한 예를 통해이를 쉽게 확인할 수 있습니다.

#
#!/bin/bash
offfset=(`ls`)
echo $offset

sudo를 사용하여이 스크립트를 실행하면 최신 버전의 Ubuntu 및 Debian에서 구문 오류가 발생합니다.

다음과 같이 스크립트를 해석 할 수있는 두 가지 옵션이 있습니다 bash.

  1. shebang을 첫 번째 줄로 이동

  2. 다음 sudo과 같이 실행하십시오 .

    sudo bash ./pi_dev_env_install.sh

1

다음을 사용하여 스크립트를 시작하십시오.

bash ./< script file > 

잘 작동합니다.


그것은 당신에게 맞을 수도 있지만, 실제로 언급 된 문제에 대한 해결책은 아닙니다.
bu5hman


0

스크립트 파일에서 dos2unix를 사용해보십시오. 때로는 숨겨진 문자가 소스에 있습니다.

명령:

dos2unix script_file.sh script_file.sh

0

의도 한 인터프리터를 재정의하는 경우 발생할 수 있습니다. 예를 들어 해시 뱅이 사용되는 것과 상관없이 sh로 실행됩니다 (해시 뱅을 사용하지 않을 때 편리함).

> sh run.sh

또는 bash를 실행하려면 다음을 수행하십시오.

> bash run.sh

스크립트 정의 해시 뱅 값을 사용하려면 다음을 사용하십시오.

> ./run.sh

-1
sudo chmod 755 <script>

제 경우에는 오류가 파일을 실행할 권한이 없었습니다. 명령을 분리 할 때만 오류 메시지가 나타납니다.

$ sudo sh
# ./install

권한 부족으로이 오류 메시지가 발생하지 않습니다.
Gilles
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.