Qual é o identificador de token de `]`?

9

O Bash Manual diz:

Quando o [formulário é usado, o último argumento para o comando deve ser a].

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

Portanto, ]não é uma palavra reservada, nem é um operador, nem é um comando interno.

Como token, qual é o identificador de token ]? PALAVRA ou NOME?

Tim
fonte
4
Na verdade, [é (também) um comando auto-sustentado: -rwxr-xr-x 1 raiz raiz 39552 3 de dezembro 18:14 / usr / bin / [Embora seja possível que exista também um "paralelo" embutido, como existe para por exemplo kill. Em alguns sistemas, o testcomando é um link simbólico [ou vice-versa. AFAIK, ]não significa nada por si só, mas é aceito para "fechar" um [- mas é mais por uma razão "estética".
Baard Kopperud
5
A linguagem shell cresceu camada por camada nos últimos 46 anos e a consistência interna nunca foi uma prioridade. Se você tentar ajustá-lo à força em qualquer tipo de estrutura teórica da linguagem formal, terá um mau momento.
Zwol
Como [é (também) um comando independente, ele geralmente possui uma página de manual ... Portanto, tente man [e / ou man test( [e testpode ser o mesmo comando).
Baard Kopperud
Tente colocar ]aspas simples ou duplas e você verá que não faz diferença; é apenas uma corda.
Curinga

Respostas:

21

]complementa [, é o sinal de [comando final .

Como a manpágina aponta, este é realmente um argumento para [, mas o [trata especialmente como o final.

Você pode se parecer com outros padrões de fechamento de comando, por exemplo, ;em find .. exec.

heemail
fonte
Obrigado. Qual é o tipo / identificador de token ]?
Tim
8
@ Tim ]não é diferente de qualquer outro caractere normal neste contexto (como argumento para um comando). O testcomando trata especialmente, mas isso depende do comando.
Muru
6
É apenas uma string e [gera um erro se seu argumento final não for exatamente igual a ].
chepner
19

O Bash não trata os caracteres [ou ](por si só) de maneira diferente de uma letra do alfabeto.

Nesse caso, o bash vê uma "palavra" [e procura um comando com esse nome. Se você procurar no seu sistema de arquivos, provavelmente descobrirá que /bin/[(ou /usr/bin/[) existe como um arquivo executável. Por acaso, o bash também fornece uma versão integrada (por uma questão de eficiência), mas isso é apenas um detalhe da implementação.

O [comando (como em, o executável com esse nome), tem uma regra que deve ser o último parâmetro que você passa para ele, ]ou então gera um erro. Isso pode ser em parte porque é esteticamente agradável, mas também serve para protegê-lo contra comandos truncados acidentalmente, o que é bom.

O fato de não serem especiais é por que você não pode omitir o espaço em branco antes e depois do [or ].


Exceções :

  • Quando [e ]ocorrer no formato correto dentro da mesma palavra, por exemplo [a-z], isso é especial e as regras de glashing do bash se aplicam.
  • O [[comando é especial e pode fazer muitas coisas [não (e os parâmetros internos [[ .. ]]são processados ​​de maneira diferente, assim como algumas quebras de linha). O correspondente ]]também é especial, pois é uma palavra reservada ao shell que não pode ser um nome de comando e finaliza o processamento especial que segue a [[palavra - chave.
ams
fonte
1
@JacobKrall Não é um caractere especial como ;ou >, é apenas um comando interno como cd. Em particular, se você digitar [x, o [não terá um significado especial.
Barmar 16/03
2
@JacobKrall Isso é verdade para todos os comandos internos. [é um comando especial , não é um caractere especial .
Barmar
@ Barmar: Justo; Retiro meus comentários.
Jacob Krall 16/03
Na verdade ]]é mais especial que ]. Ao usar [e ]são apenas palavras. Se você o omitiu ]ou substituiu por uma palavra diferente, o bash ainda será executado [, mas [produzirá um erro. No entanto [[e ]]são tratados especial na análise de tempo. Se você substituiu ]]por outra coisa, o bash relatará um erro de sintaxe. E se você omitiu o ]]bash, continuaria analisando a próxima linha procurando o ]].
kasperd
@kasperd resposta ajustada.
171716
3

Para simplificar as duas respostas anteriores, ]é apenas uma string que [requer execução.

Kenny
fonte
1
Isto parece um pouco como um comentário ...
wizzwizz4
@ wizzwizz4, dadas as perguntas de acompanhamento do OP nos comentários, acho que essa simplicidade é exatamente o que ele precisava.
Curinga
@Wildcard Eu realmente concordo. Havia algo que me tentava aprovar esta resposta, mas achei que era de baixa qualidade. (Não diminuiu o voto!) Vou editar para melhorar a marcação.
Wizzwizz4