Bash 스크립트 문제 : '선언 : 찾을 수 없음'


23

나는 잘 돌아가는 스크립트를 가지고 있었지만 오늘 그것을 실행할 때라고 말합니다 declare: not found. bash 쉘을 사용하고 있으며 스크립트 시작시 경로가 정확합니다.

내 스크립트에서 플래그가 지정된 두 줄은 다음과 같습니다.

declare -a RESPONSE
RESPONSE=($RESULT)

또한 (예상치 못한 내용이지만 첫 번째 오류로 인해 이것이 나온 것 같습니다. 언급할만한 가치는 선언에 직접 입력하면 잘 작동한다는 것입니다.

declare | grep USER

USER=ashfame
USERNAME=ashfame
           values="$SVN_BASH_USERNAME";

그래서 여기서 뭐가 잘못 되었나요?

답변:


27

sh대신에 사용 하고 bash있습니까? sh(에 링크 됨 dash)는 declare키워드 또는 구문을 지원하지 않습니다

VAR=(list) 

배열을 초기화합니다.


내 shebang 라인 #!/bin/bash만 있습니다. 내가 어떻게 그것을 실행 했습니까? 방금 실행을 시도했지만 ./script.sh작동했습니다. 그러나 그것은 작동하지 않습니다 script.sh또는 sh script.sh나는 거의 확실 나는 일주일 전에를 만든 동안 만 후자의 두 가지 방법을 사용하는 데 사용하고있다. 무엇을 설명 할 수 있습니까?
Ashfame

@Ashfame : 아마 일주일 전 현재 bash와 관련된 기능을 놓쳤으므로 sh script.sh
와도

아니요, 정확히이 스크립트가 일주일 또는 2 주 전에 작동하는 것을 의미했습니다. 또는 일부 업데이트가 변경되었을 수 있다는 의미입니까?
Ashfame

@Ashfame :이 스크립트는 지금 보여 주듯이 sh script.sh와 함께 사용할 수 없습니다.
enzotib

11

귀하의 "shebang"줄 (파일의 첫 번째 선택적 줄)이 sh대신 참조하고있는 것 같습니다 bash. 그것은해야한다

#!/bin/bash

bash 스크립트의 경우. 스크립트의 첫 줄이

#!/bin/sh

이는 엄격하게 호환되는 쉘을 사용해야 함을 나타냅니다. 우분투의 경우 dash사용됩니다. 그들이 연결하기 때문에 많은 다른 배포판에서, 이것은 문제가 발생하지 않습니다 /bin/sh/bin/bash; 그러나 우분투 /bin/dash는 시스템 스크립트가 더 빠르게 실행될 수 있도록 링크합니다 .

declare내장 중 하나입니다 bashBourne 쉘 스크립트 사양의 많은 확장; dash확장없이 해당 사양을 구현합니다.


내 오두막 라인입니다 #!/bin/bash
Ashfame

@ Ashfame : 스크립트를 어떻게 실행하고 있습니까? 스크립트 이름 만 입력하여 호출하는 경우 shebang 행이 어떤 인터프리터를 실행하는지 판별합니다. 그러나을 통해 명시 적으로 호출 sh thescript.sh하면 shdash이 해석됩니다.
intuited

1
@intuited 나는 그것을 통해 달렸다 sh script.sh. 나는 당신이 말한 것을 이해하지만이 방법으로 bash해석 할 수있는 곳을 읽었 습니다. 왜 dash여기서 역할을합니까? 우분투에만 있습니까? 내가 읽은 것이 일반적으로 Linux 용일 수 있습니다.
Ashfame

2
@Ashfame을 사용 sh script하면 인수가 있는 명령 sh을 실행하여 scriptsh가 해당 파일의 명령을 읽고 실행하게합니다. shebang은 sh로 읽지 않으며으로 시작 #하므로 주석으로 처리됩니다. 대신 당신이 실행 ./script한다면, 커널은 shebang을 읽을 것입니다. 당신의 경우에 #!/bin/bash그것은 실행됩니다/bin/bash ./script
geirha

@geirha 그렇습니다. 그것이 작동한다는 것을 알고 있지만 @intuited 언급이 dash사용될 것이므로 명확히해야합니다.
Ashfame

3

위의 오류를 재현하는 방법 :

우분투 14.04 64 비트를 사용하고 있습니다. 이 코드를 파일에 넣으십시오.

#!/bin/sh 
declare -i FOOBAR=12; 
echo $FOOBAR; 

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

el@apollo:~$ ./06.sh 
./test.sh: 2: ./test.sh: declare: not found

이를 해결하려면 대신 다음을 수행하십시오.

#!/bin/bash
declare -i FOOBAR=12;
echo $FOOBAR;

인쇄물:

el@apollo:~$ ./06.sh 
12

1

나는 같은 문제가 있었고 쉘 스크립트를 실행하기 위해 올바른 권한을 할당해야한다는 것을 기억했다.

스크립트 권한 변경 : 예 :

chmod 755 script.sh

1

다음과 같은 /bin/bash경우 대신 명령 행에서 스크립트를 실행하십시오 sh.

대신에 :

    sh script.sh

시도 :

    / bin / bash script.sh

1

우분투에는 다른 스크립트를 실행하는 스크립트가있을 수 있습니다.

some_dir/  
        | main.sh  
        | shhh.sh

#!/bin/bash -e

echo "file? $0"
# file? ./main.sh

echo "shell? $SHELL" 
# shell? /bin/bash

# sh shhh.sh
# file? shhh.sh
# shell? /bin/bash
# shhh.sh: 5: shhh.sh: declare: not found

$SHELL shhh.sh
# file? shhh.sh
# shell? /bin/bash
# foo? bar

#!/bin/bash -e

echo "file? $0"
# shhh.sh

echo "shell? $SHELL"
# shell? /bin/bash

declare foo="bar"

echo "foo? $foo"

모두 수정 sh some_script.sh하여 $SHELL some_script.sh수정했습니다.

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