Подтвердить что ты не робот

Какая разница в `declare -r` и` readonly` в bash?

В bash, какая разница в declare -r и только для readonly?

$ declare -r a="a1"
$ readonly b="b1"

Я не уверен, что выбрать.

4b9b3361

Ответ 1

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) имеет эффект : "возврат состояния ошибки не приведет к выходу оболочки".