2013-03-21 18 views
11

W Centos mój skrypt działa dobrze. Ale na Debian Squeeze po uruchomieniu skryptu, mam:

cpfailover.sh: 30: Bad substitution 

Linia skryptu powiedzieć:

SCRIPT_PATH="${BASH_SOURCE[0]}"; 

Widziałem w wielu przykładach, nawet tutaj, że jest poprawna linia nr. gdzie jest problem.

+0

można użyć "$ 0" zamiast '$ {BASH_SOURCE [0]}'? AFAIK powinny być takie same. – khachik

+1

@khachik: '$ {BASH_SOURCE [@]}' zostało wprowadzone w Bash 3.0 dla celów debugowania. To nie znaczy tak samo jak '0 $'. Zgodnie z instrukcją Bash, elementy w '$ {BASH_SOURCE [@]}' są * źródłowymi nazwami plików * odpowiadającymi elementom w '$ {FUNCNAME [@]}'. – pynexj

Odpowiedz

16

Czy używasz /bin/sh? W przypadku Debian Squeeze, /bin/sh jest dowiązaniem symbolicznym do /bin/dash, które nie obsługuje ${array[0]}.

+0

Tak Używam/bin/sh – abkrim

+0

Gracias. Zaktualizuj system do używania starego basha zamiast dash i działa dobrze. – abkrim

+4

Skoro twój skrypt zależy od konkretnych funkcji basha, sugeruję, żebyś używał/bin/bash jawnie. – pynexj

3

Zmień swój kod do

SCRIPT_PATH=$0; 

zamiast

SCRIPT_PATH="${BASH_SOURCE[0]}"; 
+0

Czy mógłbyś wyjaśnić, dlaczego uważasz, że '0 $' jest" lepsze "niż' $ {BASH_SOURCE [0]} '? –

+1

Jest kompatybilny z POSIX/bin/sh, gdzie $ {BASH_SOURCE [0]} działa tylko w bashu. Zasadniczo, jeśli nie kierujesz do wielu architektur lub starych systemów operacyjnych, powinieneś zamienić swojego shebanga na #!/Bin/bash, abyś mógł korzystać ze wszystkich funkcji basha. Pamiętaj, że Mac OSX jest dostarczany z bashem 3.2, więc jeśli kierujesz go na cel, nie możesz używać funkcji bash-4. –