Às vezes, você deseja redirecionar stdout e stderr para o mesmo local. É quando >&
é usado - aponta um descritor de arquivo para outro.
Por exemplo, se você deseja gravar stdout e stderr no mesmo arquivo (seja /dev/null
ou output.txt
), poderá redirecioná-los separadamente, com
app 1>/dev/null 2>/dev/null
ou você pode redirecionar um descritor de arquivo para o arquivo e o outro descritor de arquivo para o primeiro:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
No primeiro exemplo, 2>&1
aponta o descritor de arquivo nº 2 para onde o nº 1 já está apontando. O segundo exemplo alcança o mesmo, apenas começando com stderr.
Como outro exemplo, há casos em que o stdout (descritor de arquivo nº 1) já está apontando para o local desejado, mas você não pode fazer referência a ele pelo nome (pode estar associado a um tubo, um soquete ou algo assim). Isso geralmente acontece quando se utiliza a expansão do processo (as ` `
ou $( )
operadores), que normalmente só captura stdout, mas você pode querer incluir stderr nele. Nesse caso, você também usaria >&
para apontar stderr para stdout:
out=$(app 2>&1)
Outro exemplo comum é um pager, ou grep
utilitário similar, uma vez que o canal |
normalmente só funciona no stdout, você redirecionaria o stderr para o stdout antes de usar o canal:
app 2>&1 | grep hello
Como saber qual 2>&1
ou 1>&2
está correto? O descritor de arquivo já configurado vai para a direita >&
e o descritor de arquivo que você deseja redirecionar vai para a esquerda. ( 2>&1
significa "apontador descritor de arquivo nº 2 para descritor de arquivo nº 1".)
Alguns shells possuem atalhos para redirecionamentos comuns; Aqui estão alguns exemplos do Bash:
1>
pode ser reduzido para apenas >
1>foo 2>&1
para >&foo
ou&>foo
2>&1 | program
para |& program
app 1>/dev/null 2>&1
significaria que 2> & 1 apontariam para o arquivo para o qual 1 já estava redirecionando. Presumo que eu poderia fazer tão facilmenteapp > /dev/null &>
?the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left
. O que você quer dizer com o descritor de arquivo já configurado? O que significa o direito de?Uma situação em que você precisa é quando deseja exibir
strace
saída em um pager.strace
imprime sua saída em erro padrão e os tubos geralmente conectam a saída padrão à entrada padrão; portanto, você deve usar o redirecionamento:fonte
pipes generally connect standard output to standard input
?|
) pega a saída padrão do primeiro comando e o conecta à entrada padrão do segundo comando.Às vezes você deseja redirecionar ambos
stdout
(1
) estderr
(2
) para o mesmo local (/dev/null
por exemplo). Uma maneira de conseguir isso seria:Mas a maioria das pessoas encurtar isso redirecionando
stderr
parastdout
com2>&1
:Uma versão ainda mais curta é:
fonte
2: É para quando você terá saída proveniente de erro padrão e saída padrão e deseja que eles sejam compostos em uma única sequência.
1: Quando você deseja manipular a saída do erro padrão e da saída padrão.
fonte
>2
é enviada para / dev / null. Ou eu entendi completamente errado?Eu o uso para iniciar um trabalho desanexado:
então eu posso sair e algum programa ainda estará em execução. A funcionalidade é fornecida pelo GNU Screen, tmux e alguns outros programas - mas aqui é alcançada sem dependências externas.
fonte
nohup
oudisown
em tais casos.Imagine que existe um diretório chamado
try
que possui esses três arquivos:file file1 and file2.
Agora execute este comando:
Os três primeiros arquivos são abertos, mas
cat
gera um erro ao abrir o quarto, pois ele não existe.Agora execute:
Você não verá nenhuma saída na tela: Primeiro
1>outfile
redirecionará a saída do comando paraoutfile
e, em seguida, redirecionará (2>&1
) o erro gerado ao tentar abrirfile3
paraoutfile
.1>&2
funciona de maneira semelhante e redireciona o fluxo de erros para a saída padrão.Espero que isto ajude!
fonte
Use o
tty
comando em cada terminal para identificá-los:Supondo que esses TTYs, para redirecionar o stdout do primeiro para o segundo, execute isso no primeiro terminal:
Para restaurar o comportamento padrão stdout de pts / 0:
Veja este vídeo para uma demonstração.
fonte
O caso ao redirecionar o stderr para o stdout já foi abordado aqui (por exemplo, use-o para filtrar mensagens de erro (grep)).
O outro caso está redirecionando stdout para stderr. Uma maneira comum de usar (pelo menos para mim) é enviar avisos / mensagens de erro impressas com "echo" (em meus shellscripts) para o stderr (para que possam chamar a atenção do usuário mais facilmente).
Por exemplo,
fonte