2013-03-21 6 views
11

Auf Centos funktioniert mein Skript gut. Aber auf Debian Squeeze, wenn ich Skript ausführen, ich habe:

cpfailover.sh: 30: Bad substitution 

Zeile des Skripts sagen:

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

ich in vielen Beispielen gesehen haben, auch hier, das ist eine richtige Linie Nr. Wo ist das Problem.

+0

Können Sie "$ 0" statt '$ {BASH_SOURCE [0]}' verwenden? AFAIK sollten sie gleich sein. – khachik

+1

@khachik: '$ {BASH_SOURCE [@]}' wird in Bash 3.0 zum Zwecke der Fehlersuche eingeführt. Es bedeutet nicht dasselbe wie "$ 0". Laut BASH-Handbuch sind Elemente in '$ {BASH_SOURCE [@]}' die * Quelldateinamen *, die den Elementen in '$ {FUNCNAME [@]}' entsprechen. – pynexj

Antwort

16

Verwenden Sie /bin/sh? Unter Debian Squeeze ist /bin/sh ein Symlink zu /bin/dash, der ${array[0]} nicht unterstützt.

+0

Ja, ich benutze/bin/sh – abkrim

+0

Gracias. Update-System für den Einsatz alter Bash statt Dash und funktionieren gut. – abkrim

+4

Da Ihr Skript von Bash-spezifischen Funktionen abhängig ist, würde ich vorschlagen, dass Sie explizit/bin/bash verwenden. – pynexj

3

Code ändern zu

SCRIPT_PATH=$0; 

statt

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

könnten Sie sich fragen, warum Sie denken, '$ 0' ist" besser "als' $ {BASH_SOURCE [0]} '? –

+1

Es ist POSIX/bin/sh kompatibel, wobei $ {BASH_SOURCE [0]} nur in bash funktioniert. Im Allgemeinen sollten Sie, wenn Sie nicht auf mehrere Architekturen oder alte Betriebssysteme abzielen, Ihren Shebang auf #!/Bin/bash setzen, damit Sie alle Funktionen von bash nutzen können. Denken Sie daran, dass Mac OSX im Lieferumfang von bash 3.2 enthalten ist. Wenn Sie also darauf abzielen, können Sie die Funktionen von bash-4 nicht verwenden. –