Различия между объявить, набрать и локальной переменной в Bash - PullRequest
37 голосов
/ 12 декабря 2010

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

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

ОБНОВЛЕНИЕ: добавлено local к вопросу.

Ответы [ 3 ]

22 голосов
/ 18 апреля 2012
  • Разница между typeset и declare:

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

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

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

11 голосов
/ 12 декабря 2010

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

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

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

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

5 голосов
/ 12 декабря 2010

В руководстве по Bash в разделе 4.2 Команды Bash Builtin говорится:

'typeset'
typeset [-afFrxi] [-p] [NAME [=VALUE] ...]
Команда typeset поставляется для совместимости с оболочкой Korn;тем не менее, он устарел в пользу встроенной команды Declare.

...