Problem ze skryptem Bash: „deklaruj: nie znaleziono”

23

Miałem skrypt, który działał dobrze, ale kiedy go uruchomiłem dzisiaj, mówi declare: not found. Używam powłoki bash, a ścieżka na początku skryptu jest poprawna.

Dwie oflagowane linie w moim skrypcie są następujące:

declare -a RESPONSE
RESPONSE=($RESULT)

Mówi także, że (jest nieoczekiwany, ale myślę, że nadchodzi z powodu pierwszego błędu. Warto wspomnieć o tym, że kiedy wpisuję deklarację, działa to dobrze.

declare | grep USER przedstawia

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

Co się tu dzieje?

Popiół
źródło

Odpowiedzi:

27

Używasz shzamiast bash? sh(połączone z dash) nie obsługuje declaresłowa kluczowego ani składni

VAR=(list) 

do inicjowania tablic.

enzotib
źródło
Moja linia shebang jest #!/bin/bashtylko. Miałeś na myśli, jak to wykonuję? Właśnie próbowałem wykonać to ./script.shi działało. Ale to nie działa script.shalbo sh script.shi jestem prawie pewien, że kiedyś używałem tylko dwóch ostatnich metod podczas Stworzyłem go tydzień temu. Co to może wyjaśnić?
Ashfame
@Ashfame: może tydzień temu brakowało funkcji specyficznych dla basha, które masz teraz, więc działało również z sh script.sh
enzotib
Nie, miałem na myśli, że dokładnie ten skrypt działał tydzień lub dwa tygodnie temu. Czy miałeś na myśli, że jakaś aktualizacja mogła coś zmienić?
Ashfame
@Ashfame: Nie wiem, ten skrypt, jak go teraz pokazujecie, nie może współpracować z sh script.sh.
enzotib
11

Podejrzewam, że twoja linia „shebang” (opcjonalna pierwsza linia pliku) odnosi się shzamiast bash. Powinno być

#!/bin/bash

dla skryptów bash. Jeśli pierwsza linia skryptu to

#!/bin/sh

oznaczałoby to, że należy zastosować powłokę ściśle zgodną z bourne; w przypadku Ubuntu dashjest używany. W wielu innych dystrybucjach nie powoduje to problemu, ponieważ łączą się /bin/shz /bin/bash; jednak ubuntu prowadzi do linków /bin/dash, aby umożliwić szybsze uruchamianie skryptów systemowych.

declareWbudowane jest jednym z bash„S wiele przedłużeń opisie skryptu powłoki Bourne; dashpo prostu implementuje tę specyfikację bez rozszerzeń.

intuicyjny
źródło
Moja linia #!/bin/bash
shebang
@Ashfame: jak uruchamiasz skrypt? Jeśli wywołujesz go po prostu wpisując nazwę skryptu, linia shebang określi, który interpreter go uruchamia. Jednakże, jeśli jawnie ją wywołujesz sh thescript.sh, shpowłoka - tzn. dashZinterpretuje ją.
intuicyjnie
1
@intuited Uruchomiłem to sh script.sh. Rozumiem, co powiedziałeś, ale przeczytałem gdzieś, że dzięki tej metodzie bashzinterpretuję to. Dlaczego miałoby dashsię tutaj tak odnosić? Czy dotyczy tylko Ubuntu? Może to, co przeczytałem, było ogólnie dla Linuksa.
Ashfame
2
@Ashfame z sh scripttobą uruchamia polecenie shz argumentem script, co powoduje, że sh czyta i wykonuje polecenia z tego pliku. Shebang nie jest czytany przez sh, zaczyna się od a #, więc jest traktowany jako komentarz. Jeśli zamiast tego uruchomisz ./script, jądro odczyta shebang, który w twoim przypadku jest #!/bin/bash, i tak się wykonuje/bin/bash ./script
geirha
@geirha tak, tak wiem, jak to działa, ale @ zainicjowana wzmianka, która dashzostanie wykorzystana, więc muszę to wyjaśnić
Ashfame
3

Jak odtworzyć powyższy błąd:

Używam Ubuntu 14.04 64 bit. Umieść ten kod w pliku:

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

Uruchom tak:

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

Aby to naprawić, zrób to zamiast tego:

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

Wydruki:

el@apollo:~$ ./06.sh 
12
Eric Leschinski
źródło
1

Miałem ten sam problem, a potem przypomniałem sobie, że musisz przypisać odpowiednie uprawnienia do wykonania skryptu powłoki.

Zmień uprawnienia do skryptu, na przykład:

chmod 755 script.sh
Edgard Padilla
źródło
1

Spróbuj uruchomić skrypt za pomocą /bin/bashwiersza polecenia, jeśli sh(:

Zamiast :

    sh script.sh

Próbować :

    / bin / bash script.sh
Spacerować
źródło
1

Na Ubuntu możesz mieć skrypt, który wykonuje inne skrypty, na które się natknąłem.

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"

Zmieniam wszystko, sh some_script.shaby $SHELL some_script.shto naprawić.

Rahman Malik
źródło