Definição de variável no bash usando a palavra-chave local

33

Estou aprendendo o script bash e encontrei isso no meu / usr / share / bash-complete, linha 305:

local cword words=()

O que isso faz? Todos os tutoriais online estão apenas no formato

local var=value
Alexandre Santos
fonte

Respostas:

92

Embora eu goste da resposta dada pelo jordanm , acho que é igualmente importante mostrar aos Linuxusuários menos experientes como lidar com essas questões sozinhos.

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

Primeiro, todos os comandos que podem ser executados Bashsem digitar um caminho explícito, como ./commandpodem ser divididos em duas categorias: Bash shell builtinse external commands. Bash shell builtinsvem instalado Bashe faz parte dele enquanto external commandsnão faz parte Bash. Isso é importante porque Bash shell builtinsestão documentados internamente man bashe sua documentação também pode ser chamada com helpcomando, enquanto external commandsgeralmente são documentados por si próprios manpagesou levam algum sinal de -h, --helpalerta. Para verificar se um comando é um Bash shell builtinou um external command:

$ type local
local is a shell builtin

Será exibido 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 vimnão é um shell builtincomando externo localizado em /usr/bin/vim. No entanto, às vezes o mesmo comando pode ser instalado como um external commande shell builtinao mesmo tempo. Adicione -aà typelista 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 builtine um external command. No entanto, se você apenas digitasse echoe pressionasse Returna, shell builtinseria chamado porque aparece primeiro nesta lista. Observe que todas essas versões echodo não precisam ser as mesmas. Por exemplo, no meu sistema, o sinalizador /usr/bin/echoé --helpflagrado enquanto builtino não.

Ok, agora quando sabemos que localé um shell incorporado, vamos descobrir como ele 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 muitas manpagesformas de documentação no *nixmundo. Dito isto, o comando que você perguntou na sua pergunta é perfeitamente legal. Por sua vez, ...caractere significa que o argumento anterior pode ser repetido. Você também pode ler sobre esta 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.

Portanto, no final do dia, espero que agora você tenha mais facilidade para entender como os diferentes comandos Linuxfuncionam.

Arkadiusz Drabczyk
fonte
5
Resposta muito boa. Eu estava lendo isso, esperando que você explicasse como um iniciante poderia descobrir por si mesmo qual era a atribuição da matriz, apenas a partir do código var=(), mas suponho que isso seja um pouco demais para descobrir sem ao menos saber o nome do que você está procurando . ;)
Caractere curinga
Os reservatórios que não são do tipo bash também são compatíveis local?
palswim
2
Eu assinei em apenas para que eu possa upvote sua resposta :)
harendra Singh
@Wildcard Como a matriz é da sintaxe bash, em oposição a um comando, você pode encontrá-la definida em man bash. Uma vez lá, digite /Arrays$para pular para a seção em matrizes. (A $seguir Arraysé para evitar alternar entre as referências no texto da seção.) A partir daí, você pode digitar fpara avançar uma página ou bretroceder. Digite qpara sair da página de manual quando terminar.
Taylor Edmiston
Além disso, a execução helpsem args listará todos os bash internos se você estiver curioso para ver mais.
Taylor Edmiston
29

A localpalavra-chave pode receber várias variáveis. Fornecer um valor à variável é opcional. Seu exemplo declara duas variáveis cworde words. A wordsvariável recebe uma matriz vazia.

jordanm
fonte
18

localsimplesmente declara que uma variável tem escopo apenas na função atualmente definida, para que o ambiente principal de execução não possa "ver" o valor. Você não pode usar localfora 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, $onlyherenão estava visível fora do escopo da função.

Otheus
fonte
Essa resposta faz mais sentido para quem precisa de um entendimento rápido.
Alex Raj Kaliamoorthy