Vejo coisas como command 1> out
ou com 2>&1
para redirecionar o stderr, mas às vezes também vejo &>
por si só, etc.
Qual é a melhor maneira de entender &
e o que significa exatamente?
fonte
Vejo coisas como command 1> out
ou com 2>&1
para redirecionar o stderr, mas às vezes também vejo &>
por si só, etc.
Qual é a melhor maneira de entender &
e o que significa exatamente?
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.
&>
significa?command >file 2>&1
ordem dos redirecionamentos é importante. Se você escrevercommand 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 ostandard error
"?> FILE 2>&1
e&> FILE
são equivalentes. Veja 8.2.3.2. Redirecionamento de erros no Guia Bash para iniciantes, capítulo 8fonte
&> 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-likeksh
,dash
ebash
; de fato, o padrão é baseado em torno de Bourne shell eksh
. 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&>
embash
(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 :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 paracommand
entrarFILE
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 , fazendo
3&>2
Exemplo de manipulação de descritores de arquivos, entre muitos, seria capturar a saída do
dialog
comando na variávelTambém é importante notar que isso
&>
é específicobash
. Emzsh
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:
fonte