2015-12-01 9 views
6

Wie erstelle ich beide local und declare -r (schreibgeschützt) Variable in bash?Wie erstellt man eine lokale schreibgeschützte Variable in bash?

Wenn ich tun:

function x { 
    declare -r var=val 
} 

Dann habe ich einfach eine globale var erhalten, die schreibgeschützt ist

Wenn ich tun:

function x { 
    local var=val 
} 

Wenn ich tun:

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

Dann bekomme ich ein global wieder (ich kann auf var von anderen Funktionen zugreifen).

Wie kombiniere ich lokale und schreibgeschützte in bash?

+5

'declare' ist dokumentiert als deklariert eine lokale Variable, es sei denn, Sie fordern explizit eine globale an, indem Sie das Flag '-g' setzen. Ich habe gerade auf meinem eigenen System getestet, und es verhält sich wie dokumentiert. Können Sie erklären, warum Sie glauben, dass dies nicht der Fall ist? – ruakh

Antwort

15

Obwohl help local nicht erwähnt es in Bash 3.x, local können die gleichen Optionen wie declare akzeptieren (wie von mindestens Bash 4.3.30, diese Dokumentation Versehen korrigiert wurde).

So können Sie einfach tun:

local -r var=val 

Das heißt, declareinnerhalb einer Funktion standardmäßig das gleiche in einem Kommentar als local, wie ruakh Staaten verhält, so dass Ihre erste Versuch sollte auch gelungen beim Erstellen einer lokalen schreibgeschützten Variable.

In Bash 4.2 und höher können Sie Überschreibung dies mit declare ‚s -g Option, um eine globale Variable zu erstellen, auch aus dem Inneren einer Funktion (Bash 3.x tut nicht unterstützen diese.)

0

Wenn Sie Exit-Code Sie diesen Ansatz

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

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

f 

Drucke verwenden:

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

Wie hängt das mit der Frage zusammen? Nebenbei bemerkt: Sie brauchen nicht ';', um die letzte Anweisung in einer Zeile zu beenden (es sei denn, es folgt direkt das abschließende '}'). '" Value: $ t "' ist sowohl robuster als auch bequemer als ''Value:' $ t'. – mklement0