O Bash não trata os caracteres [
ou ]
(por conta própria) diferentes de uma letra do alfabeto.
Nesse caso, o bash vê uma "palavra", [
, e procura um comando com esse nome. Se você olhar em seu sistema de arquivos, você provavelmente descobrirá que /bin/[
(ou /usr/bin/[
) existe como um arquivo executável. Por acaso, o bash também fornece uma versão incorporada (por uma questão de eficiência), mas isso é apenas um detalhe de implementação.
O comando [
(como em, o executável com esse nome), tem uma regra que o último parâmetro que você passa para ele deve ser ]
ou então gera um erro. Isso pode ser em parte porque é esteticamente agradável, mas também serve para protegê-lo de comandos truncados acidentalmente, o que é legal.
O fato de não serem especiais é o motivo pelo qual você não pode omitir o espaço em branco antes e depois do [
ou ]
.
Exceções :
- Quando
[
e ]
ocorrem no formato correto na mesma palavra, por exemplo [a-z]
, então é especial e as regras globbing do bash se aplicam.
- O comando
[[
é especial e pode fazer muitas coisas [
não pode (e os parâmetros dentro de [[ .. ]]
são processados de forma diferente, assim como algumas quebras de linha). O ]]
correspondente também é especial, pois é uma palavra reservada do shell que não pode ser um nome de comando e finaliza o processamento especial que segue a palavra-chave [[
.