2014-05-08 15 views
9

consideri il seguente script (sintassi aritmetica che viene utilizzato per local_var2 è irrilevante per questo caso):Differenza tra ksh e bash script di

#!/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 

Quando eseguito produce il seguente output:

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 

(che non è quello che ci si aspetta!)

Se eseguo lo stesso script in bash, l'output è:

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 

(che è quello che ci si aspetta!)

+1

testato e confermando l'uscita! Sebbene, oltre a dire che ksh fa schifo, non ho spiegazioni per questo ;-) – zmo

+0

con un 'set -vx' in codice (e per shell dipendente dalla funzione) vedrai che il contenuto di varaible è chiaramente diverso da quello previsto a primo utilizzo della seconda chiamata – NeronLeVelu

risposta

7

Questo è uno dei stranezza di ksh93.

typeset ting di variabili per definire il campo di applicazione come locali funziona solo con lo stile definizione della funzione:

function func_name 
{ 
} 

Non con lo stile definizione della funzione:

func_name() 
{ 
} 

Con lo stile func_name(), tutto è globale. Quindi il comportamento di ksh è come previsto !!!

Ma bash è chiaramente più sicuro di ksh a questo proposito. Quindi imposta la portata delle variabili in entrambe le funzioni come locali quando è stato utilizzato typeset.

C'è FAQ ingresso nella documentazione ksh affermando la differenza tra le defintions funzione:

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 per l'illuminazione – PradyJord

2

Sulla base della descrizione in this answer, è più probabile che eseguono la versione AT & T di ksh, per il quale il typeset costruito -in rende le variabili locali solo in funzioni dichiarate con la parola chiave function.

Problemi correlati