Respostas:
O &
in 2>&1
simplesmente 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, 1
mas se você o usar 2>&1
, será enviado para o arquivo standard output stream
.
Isto &>
diz enviar ambos standard output
e 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 koko
com o seguinte conteúdo:
#!bin/bash
ls j1
echo "koko2"
Torne executável: chmod u+x koko
Agora observe que j1
não existe
Agora corra ./koko &> output
corra cat output
e 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 output
e você só verá o koko2
mesmo. Mas não a saída de erro do ls j1
comando. Isso será enviado para o standard error
que você verá em seu terminal.
Nota importante graças ao @Byte Commander:
Observe que na command >file 2>&1
ordem do redirecionamento é importante. Se você escrever command 2>&1 >file
(o que normalmente não é o que você deseja), ele primeiro redirecionará o comando stdout
para o arquivo e depois redirecionará o comando stderr
para 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>&1
ordem 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 output
que você verá no seu terminal." isso não deveria ser "para o standard error
"?
> FILE 2>&1
e &> FILE
sã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
, dash
e 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>&1
tecnicamente 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>&1
diz ao shell para reconectar o stdout para command
entrar FILE
primeiro, 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 dialog
comando na variável
Também é importante notar que isso &>
é específico bash
. Em zsh
este 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?