Espaços nos comandos com redirecionamento

4
program 2> error.log 
program &> filename 
program >> filename 2>&1
program 2>&1

Consegui descobrir o que essas linhas significam.

No entanto, não entendo muito bem onde devo colocar os espaços. Eu também me preocupo que realmente não importa onde colocar espaços. Obrigado pela leitura.

    
por Smile 05.12.2017 / 10:19

1 resposta

5

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 
    
por Sergiy Kolodyazhnyy 05.12.2017 / 10:45