2015-12-01 23 views
6

Come si creano entrambe le variabili local e declare -r (di sola lettura) in bash?Come creare una variabile di sola lettura locale in bash?

Se lo faccio:

function x { 
    declare -r var=val 
} 

Poi ho semplicemente ottenere un globale var che è di sola lettura

Se lo faccio:

function x { 
    local var=val 
} 

Se lo faccio:

function x { 
    local var=val 
    declare -r var 
} 

Poi ho un di nuovo globale (posso accedere a var da altre funzioni).

Come combinare sia locale che di sola lettura in bash?

+5

'declare' è documentato come dichiarazione di una variabile locale, a meno che non si richieda esplicitamente uno globale impostando il flag' -g'. Ho appena testato sul mio sistema e si comporta come documentato. Puoi chiarire perché ritieni che non sia così? – ruakh

risposta

15

Anche se help local non ne parla in Bash 3.x, local può accettare le stesse opzioni declare (come di almeno Bash 4.3.30, questa documentazione svista è stato corretto).

Così, si può semplicemente fare:

local -r var=val 

Detto questo, declareall'interno di una funzione di default si comporta come local, come stati ruakh in un commento, in modo che il primo tentativo dovrebbe anche riuscito nella creazione di una variabile di sola lettura locale .

In Bash 4.2 e versioni successive, è possibile Override questo con declare s' opzione -g per creare una variabile globale, anche dall'interno di una funzione (3.x Bash fa non supporto questo.)

0

Se si vuole codice di uscita è possibile utilizzare questo approccio

function f { 
    local t=$(ls asdf 2>&1) c=$?; local -r t=$t; 

    echo 'Exit code: '$c; 
    echo 'Value: '$t; 
} 

f 

Stampe:

Exit code: 1 
Value: ls: asdf: No such file or directory 
+0

In che modo si riferisce alla domanda? Nota a lato: non è necessario ';' terminare l'ultima istruzione su una riga (a meno che non sia seguita direttamente dalla chiusura '}'). '" Il valore: $ t "' è sia più robusto che più conveniente di ''Valore:' $ t'. – mklement0

Problemi correlati