В bash, какая разница в declare -r
и только для readonly
?
$ declare -r a="a1"
$ readonly b="b1"
Я не уверен, что выбрать.
В bash, какая разница в declare -r
и только для readonly
?
$ declare -r a="a1"
$ readonly b="b1"
Я не уверен, что выбрать.
tl;dr readonly
использует глобальную область действия по умолчанию даже внутри функций. declare
использует локальную область видимости в функции (если только declare -g
).
На первый взгляд без разницы.
Исследование с использованием декларации -p
$ declare -r a=a1
$ readonly b=b1
$ declare -p a b
declare -r a="a1"
declare -r b="b1"
# variable a and variable b are the same
Теперь рассмотрите разницу, когда она определена в функции
# define variables inside function A
$ function A() {
declare -r x=x1
readonly y=y1
declare -p x y
}
$ A
declare -r x="x1"
declare -r y="y1"
# ***calling function A again will incur an error because variable y
# was defined using readonly so y is in the global scope***
$ A
-bash: y: readonly variable
declare -r x="x1"
declare -r y="y1"
# after call of function A, the variable y is still defined
$ declare -p x y
bash: declare: x: not found
declare -r y="y1"
Чтобы добавить больше нюансов, можно использовать readonly
, чтобы изменить локально объявленное свойство переменной только для чтения, не затрагивая область.
$ function A() {
declare a="a1"
declare -p a
readonly a
declare -p a
}
$ A
declare -- a="a1"
declare -r a="a1"
$ declare -p a
-bash: declare: a: not found
Примечание: добавление флага -g
в оператор declare
(например, declare -rg a="a1"
) делает область видимости переменной глобальной. (спасибо @chepner).
Примечание: readonly
- это "Специальная сборка". Если Bash находится в режиме POSIX
, то readonly
(а не declare
) имеет эффект : "возврат состояния ошибки не приведет к выходу оболочки".