Aparentemente, não conheço todos os destinos de saída disponíveis para uso. Eu sei sobre stdout
( &1
) e stderr
( &2
). No entanto, depois de redirecionar os dois descritores, às vezes ainda recebo alguma saída no meu console!
O exemplo mais fácil que consigo pensar é o GNU Parallel; Cada vez que o uso, vejo um aviso de citação. Mesmo quando o faço &2>1 > file
, ainda vejo o aviso.
E o mesmo se aplica a emerge
: Quando executo o emerge e há alguns problemas, algumas informações não são impressas stdout
nem stdin
, uma vez que eu as redireciono e elas ainda passam.
Eu geralmente resolvo esses problemas usando script
, mas ainda estou me perguntando o que está causando esse problema.
bash
terminal
io-redirection
MatthewRock
fonte
fonte
/dev/tty
.parallel
:mkdir ~/.parallel; touch ~/.parallel/will-cite
irá desativar a mensagem irritante. Como alternativa, procure outras implementações deparallel
.parallel
como exemplo.Respostas:
A sintaxe que você usou está errada.
será dividido como
Isso vai:
cmd
como um trabalho em segundo plano sem redirecionamentosstderr
para um arquivo literalmente chamado1
e redirecionadostdout
parafile
A sintaxe que você deseja é:
A ordem das operações é importante. Isso vai:
stdout
parafile
stderr
para&1
- ou seja, o mesmo tratamento de arquivo questdout
O resultado é que ambos
stderr
estdout
serão redirecionados parafile
.Em
bash
, uma sintaxe não-padrão mais simples (e, portanto, não recomendo, por motivos de portabilidade)cmd &> file
faz a mesma coisa.fonte
/dev/tty
, mas espero que isso não aconteça com muita frequência (se houver).at
comando em sua máquina e possui privilégios para usá-lo, pode executar o comando viaat now
. Veja a página de manual para detalhes. Isso executará o comando por meio de um mecanismo de processo em lote e o processo nunca terá um tty para gravar. Mas, em geral, eu não me preocuparia com esse caso extremo. Normalmente, apenas processos que requerem interação e deliberadamente precisam exibir itens para os usuários, apesar do redirecionamento/dev/tty
.Existem dois problemas.
O primeiro é que a ordem importa, o segundo é
/dev/tty
.Vamos usar esse script como um exemplo de script do qual queremos capturar a saída:
test.sh
:Agora vamos ver as saídas dos comandos:
./testmyscript.sh 2>&1 >/dev/null
:Como a ordem de avaliação é da esquerda para a direita, primeiro obtemos "redirecionamento
stderr
para onde quer questdout
esteja saindo (portanto, saída do console)". Então obtemos "redirecionarstdout
para/dev/null
. Terminamos com uma situação como esta:stdout
->/dev/null
stderr
-> consoleEntão, acertamos:
./testmyscript.sh >/dev/null 2>&1
E temos:
ttdada
.Agora fazemos "Redirecionar
stdout
para/dev/null
" e depois "Redirecionar stderr para onde stdout está apontando" (então,/dev/null
). Viva!No entanto, ainda temos um problema; programa imprime em
/dev/tty
. Agora não sei como consertar esse tipo de comportamento, então é provável que você precisescript
, mas espero que esse comportamento não ocorra com muita frequência.fonte