В Bash, я должен использовать объявления вместо локальных и экспорта? - PullRequest
2 голосов
/ 17 июня 2019

Недавно я обнаружил встроенную функцию declare Bash, которая объявляет переменные с локальной областью видимости и может также использоваться для экспорта переменных или даже установки типа.

# bar an baz have local scope
foo()
{
    declare bar
    local baz
}

# bing and bong are both exported
declare -x bing
export bong

# i is an integer, j is read-only integer
declare -i i=0
declare  -ri j=10

Я начал использовать его вездеи перестал использовать локальный и экспорт.Так почему же local и export существуют?

Ответы [ 2 ]

3 голосов
/ 17 июня 2019

Они существуют из-за истории. В этом руководстве говорится, что declare было введено в bash версии 2, local было представлено ранее. Люди используют local, export и readonly по договоренности и удобочитаемости.

Когда я вижу local, я думаю - «Ох! Это должна быть локальная переменная функции. Я должен читать функцию. Когда я вижу declare, мне нужно прокрутить вверх, пока я не увижу объявление функции, чтобы узнать, нахожусь ли я в функции, и посмотреть, является ли переменная локальной.

С export, export является встроенным POSIX, поэтому он будет работать везде, что важно. Но это похоже. Когда я вижу export, я думаю: «Ох! Эта переменная экспортируется! Когда я вижу declare -x, мне нужно обновить память с помощью параметров declare (ну, это просто, -x звучит как export, но это еще одна вещь, которую нужно запомнить). Я предпочитаю писать local и export. Потому что именно так они и думают - эта переменная является локальной, эта переменная экспортируется.

Когда я читаю сценарии только с local и export, без использования declare, я знаю, что это простой сценарий. declare -i или declare -n могут усложнить ситуацию.

Также, typeset и declare являются точными синонимами. Итак, вы также можете спросить, почему declare, когда вы можете typeset? Возможно, было введено typeset, поэтому вы можете запускать ksh скрипты, используя bash без каких-либо изменений. То же самое с ключевыми словами local и readonly. Аналогично с mapfile и readarray. Конвенция. С файлом вы можете пойти с mapfile, но со строкой здесь я иногда с readarray, потому что я читаю некоторые данные в массив, а не отображаю файл.

Я считаю, что ключевое слово local (немного?) Более переносимо, чем declare. Вы могли бы прочитать экс. этот поток unix.stackexchange для получения дополнительной информации.

1 голос
/ 17 июня 2019

В большинстве случаев да! но помните, что использование declare в большинстве случаев с несколькими его флагами заставляет оболочку интерпретировать их как выражения , а не , а не просто строки присваивания. Предположим, вы хотите определить переменную для хранения только целочисленных значений с атрибутом -i

declare -i x; x=2+2; echo $x
4
export x; x=2+2; echo $x
2+2

Оболочка заставила присвоение обрабатываться как целочисленное выражение вместо простого присваивания переменной. Команды export / local не определяют эту специальную обработку, которая будет применяться к назначениям.

Также встроенные модули local / export были добавлены в bash намного раньше, чем атрибуты, которые предоставляет declare. POSIX не определяет ни local, ни declare, поэтому, если вы хотите использовать целевые сценарии, написанные на минимальной оболочке sh, будет доступен только export (обратите внимание, что экспорт функции с -f все еще только Bash- изм а не POSIX)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...