2013-03-21 8 views
11

Su Centos il mio script funziona correttamente. Ma su Debian Squeeze quando ho eseguito lo script, mi sono:

cpfailover.sh: 30: Bad substitution 

riga di script dire:

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

che ho visto in molti esempi, anche qui, che è una linea corretta no. dov'è il problema.

+0

Si può usare "$ 0" invece di '$ {BASH_SOURCE [0]}'? AFAIK dovrebbero essere uguali. – khachik

+1

@khachik: '$ {BASH_SOURCE [@]}' viene introdotto in Bash 3.0 per scopi di debug. Non significa la stessa cosa di '$ 0'. Secondo il manuale di Bash, gli elementi in $ {BASH_SOURCE [@]} 'sono i * nomi file di origine * corrispondenti agli elementi in' $ {FUNCNAME [@]} '. – pynexj

risposta

16

Si sta utilizzando /bin/sh? Su Debian Squeeze, /bin/sh è un collegamento simbolico a /bin/dash che non supporta ${array[0]}.

+0

Sì, utilizzo/bin/sh – abkrim

+0

Gracias. Sistema di aggiornamento per utilizzare la vecchia bash invece dash e funziona bene. – abkrim

+4

Dato che lo script dipende da funzioni specifiche di bash, suggerirei di usare/bin/bash esplicitamente. – pynexj

3

modificare il codice per

SCRIPT_PATH=$0; 

invece di

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

potresti eleborare sul motivo per cui ritieni che '$ 0' sia" migliore "di' $ {BASH_SOURCE [0]} '? –

+1

È compatibile POSIX/bin/sh, dove $ {BASH_SOURCE [0]} funziona solo in bash. Generalmente, se non stai mirando a più architetture o vecchi sistemi operativi, dovresti cambiare il tuo shebang in #!/Bin/bash, così puoi usare tutte le funzioni di bash. Ricorda che Mac OSX viene fornito con bash 3.2, quindi se lo stai prendendo di mira non puoi utilizzare le funzionalità di bash-4. –