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 .