Mam dwa serwery (Debian) Linux. Tworzę skrypt powłoki.
Na pierwszym tworzę tablicę w ten sposób:
#!/bin/bash
target_array=(
"/home/user/direct/filename -p123 -r"
)
To działa dobrze. Ale kiedy uruchomię to na innym serwerze, otrzymuję:
Syntax error: "(" unexpected
O ile mogę stwierdzić, oba serwery są takie same. Czy ktoś może rzucić nieco światła na to, dlaczego to nie działa?
Jeśli wpiszę go bezpośrednio do terminala, to w porządku?
Wygląda na to, że kiedy uruchomię to jako
sh scriptname.sh
Pojawia się błąd, ale jeśli uruchomię go jako
./scriptname.sh
wydaje się być w porządku. Co za różnica?
bash
shell-script
array
IGGt
źródło
źródło
cat -v <script>
sprawdzić, czy nie ma fałszywego char.sh
niebash
działa i działa tak, jaksh scriptname.sh
jest źleOdpowiedzi:
Gdy używasz
./scriptname.sh
, wykonuje się/bin/bash
tak jak w pierwszym wierszu z#!
. Ale kiedysh scriptname.sh
go używasz , wykonuje sięsh
, niebash
.sh
Powłoka ma składnię do tworzenia tablic, ale Bash ma składnię użyty.źródło
./
. na zdrowie#!/bin/sh
ish script.sh
(lub#!/bin/bash
ibash script.sh
)a[index]=x
luba=(x y)
). Niektóre interpretery sh obsługują tablice, tylko ksh88 (nie jest przeniesiony do Linux AFAIK) i niektóre starsze warianty pdksh będą obsługiwaća[index]=value
i niea=(x y)
. Na Debianiesh
zwykledash
jest bez obsługi tablic (a[index]=x
nie działa).Uruchomienie
./scriptname.sh
spowoduje odczytanie pierwszego wiersza pliku i zobaczenie, że musi on uruchomić ´ / bin / bash´ i przekazać resztę skryptu do interpretera, podczas gdy wykonaniesh scriptname.sh
przekaże plik do standardowej powłoki użytkownika (np. Ash) i być może ten inny tłumacz nie obsługuje tablic, jak Bash.źródło
sh
niekoniecznie jest „standardową powłoką użytkownika”, często jest wykonywalny (lub dowiązanie symboliczne) ish
zostanie wywołany w celu przetworzenia skryptu. Będzie to prawdą, nawet jeśli domyślną powłoką logowania dla tego użytkownika jestbash
Z
sh scriptname.sh
, używasz gosh
, niekoniecznie zbash
. Spróbuj porównaćsh --version
na obu komputerach. I / lub zdpkg -S $(which sh)
.źródło
sh
jest to dowiązanie symbolicznebash
, zachowuje się inaczej, gdy zostanie wywołane jakosh