Rozważmy następujący skrypt (arytmetyczną składni, który jest używany do local_var2 jest bez znaczenia dla niniejszej sprawy):Różnica między ksh i bash skryptu
#!/bin/ksh
function my_func1
{
typeset local_var1=one
typeset local_var2
((local_var2 = 1))
echo my_func1: local_var1 = $local_var1, local_var2 = $local_var2
}
my_func2()
{
typeset local_var1=two
typeset local_var2
((local_var2 = 2))
echo my_func2: local_var1 = $local_var1, local_var2 = $local_var2
}
local_var1=0
local_var2=0
echo before functions: local_var1 = $local_var1, local_var2 = $local_var2
my_func1
echo after my_func1: local_var1 = $local_var1, local_var2 = $local_var2
my_func2
echo after my_func2: local_var1 = $local_var1, local_var2 = $local_var2
Po uruchomieniu wytwarza następujący wynik:
before functions: local_var1 = 0, local_var2 = 0
my_func1: local_var1 = one, local_var2 = 1
after my_func1: local_var1 = 0, local_var2 = 0
my_func2: local_var1 = two, local_var2 = 2
after my_func2: local_var1 = two, local_var2 = 2
(co nie jest oczekiwane!)
Jeśli uruchomię ten sam skrypt w bashu, wyjście to:
before functions: local_var1 = 0, local_var2 = 0
my_func1: local_var1 = one, local_var2 = 1
after my_func1: local_var1 = 0, local_var2 = 0
my_func2: local_var1 = two, local_var2 = 2
after my_func2: local_var1 = 0, local_var2 = 0
(czego się spodziewać!)
testowane i potwierdzające wyjście! Chociaż, oprócz powiedzenia, że ksh jest do bani, nie mam na to żadnych wyjaśnień ;-) – zmo
z 'set -vx' w kodzie (i na powłoce zależnej od funkcji) zobaczysz, że zawartość zmiennych jest wyraźnie różna od oczekiwanej na pierwsze użycie drugiego połączenia – NeronLeVelu