Polecenie readonly

man readonly

readonly: readonly [aAf] [nazwa[=wartość] ...] lub readonly -p
    Oznaczenie zmiennych powłoki jako niezmiennych.
    
    Oznaczenie każdej NAZWY jako tylko do odczytu; wartości tych NAZW nie mogą
    być zmieniane przez późniejsze podstawienia. Jeśli podano WARTOŚĆ, jest
    ona przypisywana przed oznaczeniem jako tylko do odczytu.
    
    Opcje:
      -a        działanie na zmiennych tablicowych indeksowanych
      -A        działanie na zmiennych tablicowych asocjacyjnych
      -f        działanie na funkcjach powłoki
      -p        wyświetlenie listy wszystkich zmiennych lub funkcji tylko do odczytu,
                w zależności od tego, czy podano opcję -f
    
    Argument `--' wyłącza dalsze przetwarzanie opcji.
    
    Stan wyjściowy:
    Zwracana jest prawda, chyba że podano nieprawidłową opcję lub NAZWĘ.

Podpowiedź

Jeżeli chcesz deklarowac zmienne lokalne tylko do odczytu (np. wewnątrz funkcji) zapoznaj się z poleceniem declare -r.

Przykłady użycia

Polecenie readonly definiuje zmienną jako tylko do odczytu.

Kod do skopiowania Wykonanie kodu
readonly foo="test"
bar="test"

echo "zmienna foo: ${foo}"
echo "zmienna bar: ${bar}"

foo="produkcja"
bar="produkcja"

echo "zmienna foo: ${foo}"
echo "zmienna bar: ${bar}"

readonly bar
bar="jednak test"

echo "zmienna foo: ${foo}"
echo "zmienna bar: ${bar}"
johny@ThinkPad:~$ readonly foo="test"
johny@ThinkPad:~$ bar="test"
johny@ThinkPad:~$ echo "zmienna foo: ${foo}"
zmienna foo: test
johny@ThinkPad:~$ echo "zmienna bar: ${bar}"
zmienna bar: test
johny@ThinkPad:~$ foo="produkcja"
bash: foo: readonly variable
johny@ThinkPad:~$ bar="produkcja"
johny@ThinkPad:~$ echo "zmienna foo: ${foo}"
zmienna foo: test
johny@ThinkPad:~$ echo "zmienna bar: ${bar}"
zmienna bar: produkcja
johny@ThinkPad:~$ readonly bar
johny@ThinkPad:~$ bar="jednak test"
bash: bar: readonly variable
johny@ThinkPad:~$ echo "zmienna foo: ${foo}"
zmienna foo: test
johny@ThinkPad:~$ echo "zmienna bar: ${bar}"
zmienna bar: produkcja

Po nałożeniu na zmienną atrybutu readonly nie można było już zmienić jej wartości.

Różnica między declare i readonly

johny@ThinkPad:~$ function f() {
>     declare -r c=c1
>     readonly d=d1
>     echo "#function f() => c:_${c}_ --- d:_${d}_"
> }
johny@ThinkPad:~$ # weryfikacja $c i $d nie ustawione
johny@ThinkPad:~$ echo "#main => c:_${c}_ --- d:_${d}_"
#main => c:__ --- d:__
johny@ThinkPad:~$ # wywolanie funkcji
johny@ThinkPad:~$ f
#function f() => c:_c1_ --- d:_d1_
johny@ThinkPad:~$ # zmienna $d dalej ma swoją wartośc pomimo wyjścia z funkcji!
johny@ThinkPad:~$ echo "#main => c:_${c}_ --- d:_${d}_"
#main => c:__ --- d:_d1_