Sim, o espaçamento entre palavras e redirecionamentos não importa. Essa é a resposta curta.
Os detalhes estão no fato de que o shell (para simplificar, vamos nos referir apenas ao bash
) trata certos caracteres e grupos de caracteres como "palavras" e "metacaracteres". Do manual do bash 4.3:
metacaractere
Um caractere que, quando não mencionado, separa palavras. Um dos seguintes:
| & ; ( ) < > space tab
e
word Uma sequência de caracteres considerada como uma única unidade pelo shell. Também conhecido como um token.
Então, quando fazemos:
$ echo "hello world">/dev/null
ou
$ echo "hello world" > /dev/null
ainda são 3 palavras ("hello world" pode ser considerado uma única palavra shell porque é citada), com um caractere meta >
e espaços pares. O Shell o verá e executará o redirecionamento primeiro (assim, procurará meta caracteres primeiro) e, em seguida, executará os comandos de acordo com seu comportamento padrão.
A ordem dos redirecionamentos, no entanto, é muito importante, especialmente quando você está duplicando os descritores de arquivo com algo como 2>&1
. Digamos que você queira enviar ambos stderr e stdin para o mesmo local. Aqui está uma maneira errada de fazer isso:
$ stat ./non-existent file 2>&1 > /dev/null
stat: cannot stat './non-existent': No such file or directory
stat: cannot stat 'file': No such file or directory
Você está fazendo o descritor de arquivo 2
output para o mesmo local que 1
, que é o seu terminal, mas já estava fazendo isso. É por isso que stderr aparece.
Se você redirecionar stdout
primeiro e só então alterar onde 2
pontos - então funcionará:
$ stat ./non-existent file > /dev/null 2>&1