Определение переменной в bash с использованием локального ключевого слова

33

Я изучаю скрипты bash и нашел это в моем / usr / share / bash-завершении, строка 305:

local cword words=()

Что оно делает? Все учебники онлайн только в формате

local var=value
Александр Сантос
источник

Ответы:

92

Хотя мне нравится ответ, данный Джорданмом, я думаю, что не менее важно показать менее опытным Linuxпользователям, как справиться с такими вопросами самостоятельно.

Предлагаемый способ является более быстрым и универсальным, чем поиск ответов на случайных страницах, отображаемых на странице результатов поиска Google.

Во-первых, все команды, которые можно запускать Bashбез указания явного пути к нему, например, ./commandможно разделить на две категории: Bash shell builtinsи external commands. Bash shell builtinsпоставляются Bashи являются частью этого, а external commandsне являются частью Bash. Это важно, потому что Bash shell builtinsони документированы внутри, man bashи их документация также может быть вызвана с помощью helpкоманды, в то время external commandsкак обычно они документируются сами по себе manpagesили имеют некоторый король -h, --helpфлага. Чтобы проверить, является ли команда Bash shell builtinили external command:

$ type local
local is a shell builtin

Он будет отображаться how command would be interpreted if used as a command namehelp type). Здесь мы можем видеть, что localэто shell builtin. Давайте посмотрим на другой пример:

$ type vim
vim is /usr/bin/vim

Здесь мы видим, что vimэто не shell builtinвнешняя команда, расположенная в /usr/bin/vim. Однако иногда одна external commandи та же команда может быть установлена ​​одновременно и как, и shell builtinкак одновременно. Добавьте -aк typeсписку все возможности, например:

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

Здесь мы можем видеть, что echoэто и a shell builtinи an external command. Однако, если вы просто набрали echoи нажали Returna, shell builtinбудет вызвано, потому что он появляется первым в этом списке. Обратите внимание, что все эти версии echoне должны быть одинаковыми. Например, в моей системе /usr/bin/echoпринимает --helpфлаг, а builtinнет.

Хорошо, теперь, когда мы знаем, что localэто встроенная оболочка, давайте выясним, как она работает:

$ help local
local: local [option] name[=value] ...
Define local variables.

Create a local variable called NAME, and give it VALUE.  OPTION can
be any option accepted by `declare'.

Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.

Exit Status:
Returns success unless an invalid option is supplied, an error occurs,
or the shell is not executing a function.

Обратите внимание на первую строку: name[=value]. Все между [и ]является необязательным . Это общее соглашение, используемое во многих manpagesи формах документации в *nixмире. При этом команда, о которой вы спрашивали в своем вопросе, совершенно законна. В свою очередь, ...символ означает, что предыдущий аргумент может быть повторен. Вы также можете прочитать об этом соглашении в некоторых версиях man man:

The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.

bold text          type exactly as shown.
italic text        replace with appropriate argument.
[-abc]             any or all arguments within [ ] are optional.
-a|-b              options delimited by | cannot be used together.
argument ...       argument is repeatable.
[expression] ...   entire expression within [ ] is repeatable.

Итак, в конце дня я надеюсь, что теперь вам будет легче понять, как Linuxработают различные команды .

Аркадиуш Драбчик
источник
5
Очень хороший ответ. Я читал его, надеясь, что вы расскажете, как новичок может узнать для себя, каково было назначение массива, просто из кода var=(), но я полагаю, что это немного, чтобы понять, даже не зная названия того, что вы ищете , ;)
Wildcard
Поддерживают ли небашковые оболочки local?
Palswim
2
Я вошел в систему только для того, чтобы я мог подтвердить ваш ответ :)
Харендра Сингх
@Wildcard Поскольку массив имеет синтаксис bash, а не команду, вы можете найти его в man bash. Оказавшись там, введите, /Arrays$чтобы перейти к разделу о массивах. (Трейлинг $после Arraysсостоит в том, чтобы предотвратить циклический fпереход по текстовым ссылкам на раздел.) Оттуда вы можете напечатать, чтобы перейти на страницу вперед или bназад. Введите, qчтобы выйти из справочной страницы, когда вы закончите.
Тейлор Эдмистон
Кроме того, при запуске helpбез аргументов будут перечислены все встроенные команды bash, если вам интересно узнать больше.
Тейлор Эдмистон
29

localКлючевое слово может принимать несколько переменных. Предоставление переменной со значением необязательно. Ваш пример объявляет две переменные, cwordи words. wordsПеременной присваивается пустой массив.

jordanm
источник
18

localпросто объявляет переменную, имеющую область видимости только в определенной в данный момент функции, чтобы основная исполняющая среда не могла «увидеть» значение. Вы не можете использовать localвне функции. пример

func() {
   nonlocal="Non local variable"
   local onlyhere="Local variable"
}
func
echo $nonlocal 
echo $onlyhere

Вывод: нелокальная переменная

Так что $onlyhereне было видно за пределами функции.

Otheus
источник
Этот ответ имеет больше смысла, кто нуждается в быстром понимании.
Алекс Радж Калиамурти