2014-05-08 9 views
9

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ć!)

+1

testowane i potwierdzające wyjście! Chociaż, oprócz powiedzenia, że ​​ksh jest do bani, nie mam na to żadnych wyjaśnień ;-) – zmo

+0

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

Odpowiedz

7

Jest to jeden z tajemniczości z ksh93.

typeset ting zmiennych w celu określenia ich zakresu, jak lokalny działa tylko ze stylem definicja funkcji:

function func_name 
{ 
} 

Nie ze stylem definicja funkcji:

func_name() 
{ 
} 

ze stylem func_name(), wszystko jest światowy. Więc zachowanie ksh jest zgodne z oczekiwaniami !!!

Ale bash jest wyraźnie bezpieczniejszy niż ksh pod tym względem. Ustawiono więc zakres zmiennych w obu funkcjach jako lokalne, gdy użyto typeset.

Jest FAQ wpis w dokumentacji ksh podając różnicę między defintions funkcję:

Q18. What is the difference between function name and name()? 

A18. In ksh88 these were the same. However, the POSIX standard 
    choose foo() for functions and defined System V Release 2 
    semantics to them so that there are no local variables 
    and so that traps are not scoped. ksh93 keeps the ksh88 
    semantics for functions defined as function name, and 
    has changed the name() semantics to match the POSIX 
    semantics. Clearly, function name is more useful. 
+1

+1 do oświecenia – PradyJord

2

podstawie opisu w this answer, jesteś najprawdopodobniej uruchomionym AT & wersji T ksh, dla których typeset wbudowany -in tworzy zmienne lokalne tylko w funkcjach zadeklarowanych słowem kluczowym.