Tanto quanto eu sei, [[é uma versão aprimorada do [, mas estou confuso quando vejo [[como uma palavra-chave e [sendo mostrado como um interno.
[root@server ~]# type [
[ is a shell builtin
[root@server ~]# type [[
[[ is a shell keyword
TLDP diz
Um interno pode ser sinônimo de um comando do sistema com o mesmo nome, mas o Bash o reimplementa internamente. Por exemplo, o comando Bash echo não é o mesmo que / bin / echo, embora o comportamento deles seja quase idêntico.
e
Uma palavra-chave é uma palavra reservada, token ou operador. Palavras-chave têm um significado especial para o shell e, de fato, são os blocos de construção da sintaxe do shell. Como exemplos, por enquanto, faça e! são palavras-chave. Semelhante a um builtin, uma palavra-chave é codificada no Bash, mas ao contrário de um builtin, uma palavra-chave não é em si um comando, mas uma subunidade de uma construção de comando. [2]
Isso não deveria fazer tanto [e [[uma palavra-chave? Falta alguma coisa aqui? Além disso, esse link reafirma que ambos [e [[devem pertencer ao mesmo tipo.
if "[" $x -eq 3 ]funciona como esperado (porque Bash procura o comando chamado [, e este existe), mas if "[[" $x -eq 3 ]]não não funciona (porque mais uma vez Bash procura por um comando do nome apropriado, mas não há [[comando).
/usr/bin/echo, mas isso não significa que não seja um builtin .