Existem duas formas de redirecionamento da saída padrão e erro padrão na saída padrão . Mas qual é o melhor? e por que o &>
é considerado o perfeito?
Não consigo encontrar as diferenças, de modo que muitos tutoriais e até o manual do bash afirmam que &>
é melhor!
Então, por que devo usar &>
e não2>&1
Principalmente usando bash
shell
EDIT: Obrigado por comentaristas
Somente> & funciona em csh ou tcsh
No ksh, apenas 2> & 1 funcionam.
uso de traço> arquivo 2> e apenas 1 redirecionamento
Então, qual usar para garantir que meu script seja compatível com outros sistemas, quaisquer que sejam os shells usados!
command-line
bash
redirect
Maythux
fonte
fonte
&> somewhere
é uma abreviação apenas o bash para> somewhere 2>&1
: nas palavras do manual do bash, eles são "symantically equivalente"Respostas:
A página de manual do Bash menciona que há duas maneiras de redirecionar stderr e stdout :
&> file
e>& file
. Agora, observe que diz stderr e stdout.Nesse caso
>file 2>&1
, estamos fazendo o redirecionamento do stdout (1) para o arquivo, mas também solicitando que o stderr (2) seja redirecionado para o mesmo local que o stdout! Portanto, o objetivo pode ser o mesmo, mas a ideia é um pouco diferente. Em outras palavras "John, vá para a escola; Suzzie vá para onde John vai".E a preferência?
&>
é umabash
coisa. Portanto, se você estiver portando um script, isso não será possível. Mas se você estiver 100% certo de que seu script estará trabalhando apenas no sistema com bash - então não há preferênciaAqui está um exemplo com
dash
o Debian Amquist Shell, que é o padrão do Ubuntu.Como você pode ver, o stderr não está sendo redirecionado
Para resolver suas edições na pergunta, você pode usar a instrução if para verificar a variável $ SHELL e alterar os redirecionamentos de acordo
Mas para a maioria dos casos
> file 2>&1
deve funcionarEm termos mais técnicos, o formulário
[integer]>&word
é chamado Duplicating Output File Descriptor e é um recurso especificado pelo padrão POSIX Shell Command Language, suportado pela maioria dos shells compatíveis com POSIX e semelhantes ao Brourne.Consulte também O que significa e exatamente no redirecionamento de saída?
fonte
&>
.... @Maythux em conchas que não suportam&>
por exemplo,dash
você precisa usar o trivial>file 2>&1
redirecionamento ..>file 2>&1
. Este trabalho em todas as conchas/etc/passwd
para cada usuário são shells interativos. Os scripts do sistema costumamdash
ser, a menos que seja especificado de outra forma. Quanto ao padrão, é determinado pelo que é simbolizado/bin/sh
no caso do Ubuntudash
. No RHEL ébash
, no FreeBSD étcsh
fonte e outra fonteEm geral, eu recomendaria seguir a maneira de fazer as coisas do Bourne-again SHell , já que o bash é sem dúvida o shell Unix mais popular do mercado. O Bash normalmente usa
&>
ou2>&1
. IMHO, nem é "perfeito", então eu recomendo esquecer essa bobagem. Realisticamente, qual deles você deve usar depende do que você está tentando fazer.2>&1
mescla stderr com stdout, o que pode ser útil se, por exemplo, você desejar canalizar texto stderr. Portanto, por exemplo, se você deseja ver se um programa imprime uma determinada mensagem stderr, mas não deseja que sua tela seja preenchida com (provavelmente) lixo desnecessário, você pode fazer algo assimprogram 2>&1 | grep crashed
, que pesquisará o stdout e o stderr em um programa chamado "programa" para a palavra "travou".Por outro lado, se você não quer que um programa imprima nada, você pode simplesmente executar
program &> /dev/null
, o que redirecionará o stderr e o stdout para / dev / null, um arquivo especial que magicamente faz as coisas desaparecerem. Ou, se você deseja salvar a saída de um programa (talvez para relatar um bug ou algo assim), você pode redirecionar stderr e stdout para um arquivo:program &> log.txt
redirecionará todos os dados para um arquivo chamado "log.txt". Se você quiser, poderá redirecionar o stdout e o stderr viaprogram 2> log.txt > log.txt
ouprogram 2>&1 | cat > log.txt
, ambos os quais terão o mesmo efeito que o uso&>
. Se você fizer algo assimprogram 2>&1 > file
, apenas o stdout será redirecionado, mas o stderr ainda poderá ser canalizado para outro programa, como o gato, que poderá ser redirecionado conforme mostrado acima. No entanto, digitar&>
é mais fácil do que qualquer um dos exemplos acima, pois envolve a digitação de menos caracteres (e é um pouco mais fácil para os seres humanos lerem). Observe queprogram 2> log.txt > log.txt
pode ser mais provável que funcione em shells que não sejam do bash.PS: se você está preocupado com as pessoas que usam outras conchas, há algo que você pode adicionar à primeira linha do seu script chamada "número mágico" ou "shebang". Essa é essencialmente uma maneira de garantir que outros computadores (particularmente aqueles que executam sistemas operacionais semelhantes ao Unix) saibam qual programa usar para executar um script. Scripts diferentes usam shebangs diferentes. Um shebang para um script bash é assim:
Se você usar o acima como a primeira linha de um determinado script, o bash geralmente será usado para executar o referido script. Isso tornará muito mais difícil para alguém executar acidentalmente o script com o shell errado.
PS: Eu não vou mentir: até agora, eu não sabia que alguém poderia usar
>&
, mas, no que diz respeito ao bash, parece fazer o mesmo que&>
. Você aprende algo novo a cada dia.fonte
#!
linha para solicitar explicitamentebash
, ela nem sempre está disponível em outros sistemas. Muitas vezes, os desenvolvedores / administradores de sistemas precisam escrever scripts portáteis para sistemas nos quaisbash
podem não estar disponíveis e pode não estar sob seu controle para instalarbash
. O>file 2>&1
é apenas muito portátil.>file 2>&1
É bom saber que é mais portátil. Vou fazer uma edição para refletir isso.No Manual de Referência do Bash -> 3.6.4 Redirecionando a saída padrão e o erro padrão :
Também é bom consultar o wiki de Greg sobre Entrada e Saída -> 4.2. Manipulação de descritor de arquivo :
fonte
2>&1
é shell Bourne / POSIX padrão.&>
é uma extensão do bash e não um padrão de jure .Se você escrever scripts usando extensões bash, mais cedo ou mais tarde, você encontrará falhas impressionantes com mensagens de erro de sintaxe enigmática, porque elas estão sendo executadas em um shell padrão.
fonte