Variable definition no bash usando a palavra-chave local

24

Estou aprendendo o bash scripting e descobri isso no meu / usr / share / bash-completion, linha 305:

local cword words=()

O que isso faz? Todos os tutoriais on-line estão no formato

local var=value
    
por Alexandre Santos 08.05.2015 / 21:47

3 respostas

22

A palavra-chave local pode ter várias variáveis. Fornecer a variável com um valor é opcional. Seu exemplo declara duas variáveis, cword e words . A variável words é atribuída a uma matriz vazia.

    
por 08.05.2015 / 22:04
75

Embora eu goste de resposta dada por jordanm , acho que é igualmente importante mostrar menos experientes Linux usuários como para lidar com essas questões por si mesmos.

A maneira sugerida é mais rápida e versátil do que procurar respostas em páginas aleatórias exibidas na página de resultados de pesquisa do Google.

Primeiro, todos os comandos que podem ser executados em Bash sem digitar um caminho explícito para ele, como ./command , podem ser divididos em duas categorias: Bash shell builtins e external commands . Bash shell builtins vem instalado com Bash e faz parte dele, enquanto external commands não faz parte de Bash . Isso é importante porque Bash shell builtins estão documentados em man bash e sua documentação também pode ser chamada com o comando help , enquanto external commands são geralmente documentados em seus próprios manpages ou recebem um pouco de -h, --help flag. Para verificar se um comando é um Bash shell builtin ou um external command :

$ type local
local is a shell builtin

Ele mostrará how command would be interpreted if used as a command name (de help type ). Aqui podemos ver que local é um shell builtin . Vamos ver outro exemplo:

$ type vim
vim is /usr/bin/vim

Aqui, podemos ver que vim não é um shell builtin , mas um comando externo localizado em /usr/bin/vim . No entanto, às vezes, o mesmo comando pode ser instalado como external command e ser shell builtin ao mesmo tempo. Adicione -a a type para listar todas as possibilidades, por exemplo:

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

Aqui, podemos ver que echo é um shell builtin e um external command . No entanto, se você acabou de digitar echo e pressionar Return , um shell builtin seria chamado porque aparece primeiro nesta lista. Observe que todas essas versões de echo não precisam ser iguais. Por exemplo, no meu sistema /usr/bin/echo leva --help bandeira enquanto builtin não.

Ok, agora, quando sabemos que local é um shell embutido, vamos descobrir como funciona:

$ 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.

Observe a primeira linha: name[=value] . Tudo entre [ e ] é opcional . É uma convenção comum usada em muitos manpages e forma de documentação em *nix world. Dito isto, o comando que você perguntou sobre a sua pergunta é perfeitamente legal. Por sua vez, ... character significa que o argumento anterior pode ser repetido. Você também pode ler sobre essa convenção em algumas versões de 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.

Então, no final do dia, espero que agora você tenha mais facilidade para entender como os diferentes comandos em Linux funcionam.

    
por 08.05.2015 / 23:38
10

local simplesmente declara uma variável para ter escopo somente na função atualmente definida, para que o ambiente de execução principal não possa "ver" o valor. Você não pode usar local fora de uma função. Exemplo

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

Saída:     Variável não local

Portanto, $onlyhere não era visível fora do escopo da função.

    
por 08.05.2015 / 22:51