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

Различия между объявлением, набором и локальной переменной в Bash

При вводе переменных в Bash в чем разница между declare и typeset? При использовании внутри функции: в чем разница между declare и typeset и local?

Единственная разница, с которой я столкнулся, заключается в том, что набор носителей переносится на скрипты ksh. Кроме того, есть ли какие-либо причины, по которым нужно быть предпочтительнее другого?

UPDATE: добавлен вопрос local.

4b9b3361

Ответ 1

  • Разница между typeset и declare:

Первый более портативный (например, ksh), в то время как последний предпочтительнее, когда переносимость не вызывает беспокойства.

  • Разница между declare (или typeset) и local при использовании внутри функции:

Первое подразумевает последнее, но более мощное. Например, declare -i x делает x атрибутом integer, declare -r x делает x только для чтения и т.д.

Ответ 2

Что касается bash, нет, нет никакой разницы. Фактически, в manpage они имеют одно и то же определение

объявить [-aAfFilrtux] [-p] [name [= value]...]
typeset [-aAfFilrtux] [-p] [имя [= значение]...]
Объявить переменные и/или дать им атрибуты. Если имена не указаны после этого отображают значения переменные. Будет отображена опция -p атрибуты и значения каждого имя...

Я также нашел этот маленький лакомый кусочек, который еще раз подтверждает мою претензию, а также переносимость ksh, о которой вы упомянули.

Объявить или набрать встроенные значения, , которые являются точными синонимами, позволяют модифицировать свойства переменных. Это очень слабая форма набора текста [1] доступно в некоторых программах языки. Команда declare специально для версии 2 или новее Bash. Команда набора также работает в сценариях ksh.

Ответ 3

В руководстве Bash в разделе 4.2 Bash Встроенные команды в нем указано:

'набрана'
          typeset [-afFrxi] [-p] [ИМЯ [= VALUE]...]
     Команда 'typeset' поставляется для совместимости с Korn      оболочка; однако он устарел в пользу "объявления",      встроенная команда.