Respostas:
O &in 2>&1simplesmente diz que o número 1é um descritor de arquivo e não um nome de arquivo. Nesse caso, o standard output file descriptor.
Se você usar 2>1, isso redirecionará os erros para um arquivo chamado, 1mas se você o usar 2>&1, será enviado para o arquivo standard output stream.
Isto &>diz enviar ambos standard outpute standard error, em algum lugar. Por exemplo ls <non-existent_file> &> out.file,. Deixe-me ilustrar isso com um exemplo.
Configuração:
Crie um arquivo kokocom o seguinte conteúdo:
#!bin/bash
ls j1
echo "koko2"
Torne executável: chmod u+x koko
Agora observe que j1não existe
Agora corra ./koko &> output
corra cat outpute você verá
ls: cannot access 'j1': No such file or directory
koko2
Ambos, standard error( ls: cannot access 'j1': No such file or directory) e standard output( koko2), foram enviados para o arquivo output.
Agora execute-o novamente, mas desta vez:
./koko > output
Faça cat outpute você só verá o koko2mesmo. Mas não a saída de erro do ls j1comando. Isso será enviado para o standard errorque você verá em seu terminal.
Nota importante graças ao @Byte Commander:
Observe que na command >file 2>&1ordem do redirecionamento é importante. Se você escrever command 2>&1 >file(o que normalmente não é o que você deseja), ele primeiro redirecionará o comando stdoutpara o arquivo e depois redirecionará o comando stderrpara o seu agora não utilizado stdout, para que ele apareça no terminal e você possa canalizá-lo ou redirecioná-lo novamente, mas não será gravado no arquivo.
command >file 2>&1ordem dos redirecionamentos é importante. Se você escrever command 2>&1 >file(o que normalmente não é o que você deseja), ele primeiro redirecionará o stdout do comando para o arquivo e depois redirecionará o stderr do comando para o stdout agora não utilizado, para que ele apareça no terminal e você possa canalizá-lo ou redirecione-o novamente, mas não será gravado no arquivo.
standard outputque você verá no seu terminal." isso não deveria ser "para o standard error"?
> FILE 2>&1e &> FILEsão equivalentes. Veja 8.2.3.2. Redirecionamento de erros no Guia Bash para iniciantes, capítulo 8
&> FILEé específico apenas para o Bash, ao passo que >FILE 2>&1é entendido por um número maior de cartuchos.
O [n]>&wordé chamado de duplicação arquivo de saída descritor (ver ponto 2.7.6 do POSIX Shell idioma padrão). Este comportamento particular é característica de conchas, incluindo Bourne-like ksh, dashe bash; de fato, o padrão é baseado em torno de Bourne shell e ksh. Examinando os manuais tcsh e csh , eles aparentemente não fornecem a capacidade de duplicar qualquer descritor de arquivo, no entanto, a partir da descrição de >&, isso se comporta como &>em bash(isto é, redireciona erros e a saída normal para o arquivo).
Em sistemas como o * nix, incluindo o Ubuntu, você costuma ouvir que tudo é arquivo, ou melhor, um descritor de arquivos . A saída padrão é o descritor de arquivo constante 1 e o erro padrão é o descritor de arquivo 2. Portanto, > FILE 2>&1tecnicamente significa o descritor de arquivo duplicado 2 no descritor de arquivo 1. Em outras palavras, esta resposta :
O 2> & 1 diz ao shell para fornecer ao comando um descritor de arquivo 2 que é uma duplicata do descritor 1. (ou seja, stderr & stdout apontam para o mesmo fd).
A chave aqui é observar que o descritor 1 deve ser definido primeiro. Como o shell processa os redirecionamentos da ordem da esquerda para a direita, o comando command >FILE 2>&1diz ao shell para reconectar o stdout para commandentrar FILEprimeiro, e somente então o descritor 2 pode se tornar uma cópia de 1, ou seja, 1 e 2 apontam para o mesmo local - FILE.
Obviamente, isso vai além do erro padrão e da saída padrão. Como mostra esta resposta , fazendo3&>2
... você duplica (dup2) o filedescritor 2 no filedescriptor 3, possivelmente fechando o filedescriptor 3 se já estiver aberto
Exemplo de manipulação de descritores de arquivos, entre muitos, seria capturar a saída do dialogcomando na variável
Também é importante notar que isso &>é específico bash. Em zsheste se comporta da mesma, mas de acordo com a documentação, "... não tem o mesmo efeito que '> palavra 2> & 1' na presença de multios". Em conformidade com POSIX /bin/sh, isso seria tratado como redirecionamento regular com a colocação do comando em segundo plano. Consulte também: Existe algum código sh que não seja código bash sintaticamente válido? .
Veja também:
&>significa?