tee stdout ao stderr?


17

Gostaria de enviar stdout de um processo para o stdin de outro processo, mas também para o console. Enviando stdout para stdout + stderr, por exemplo.

Por exemplo, eu tenho um git editalias para o seguinte:

git status --short | cut -b4- | xargs gvim --remote

Gostaria que a lista de nomes de arquivos fosse enviada para a tela e também para xargs.

Então, existe algum teeutilitário semelhante que faça isso? Para que eu possa fazer algo como:

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote

Respostas:


14

tee pode duplicar para o console atual usando tee /dev/tty

git status --short | cut -b4- | tee /dev/tty | xargs gvim --remote

Como alternativa, você pode usar /dev/stdoutou /dev/stderreles podem ser redirecionados se o seu comando estiver em um script. Observe que /dev/ttysempre será o console (e pode não existir em um shell não interativo). Isso está errado, leia os comentários.


1
De fato, no pipeline que você mostra /dev/stdout é redirecionado. Ou seja, se você estivesse usando tee /dev/stdouto efeito, tudo será enviado xargsduas vezes e nada será direcionado ao terminal.
Celtschk

/dev/stdoutnão é redirecionado por um canal, ele permanecerá a saída padrão do processo atual. No entanto, se você encapsular o comando em um script e redirecionar o stdout desse script, ele /dev/stdoutserá redirecionado. Em um console interativo, tee /dev/ttye tee /dev/stdouttem o mesmo efeito, mesmo ao usar tubos.
22720 Vincent Vincent

Se você não acredita em mim, inicie seu shell e digite echo foo | tee /dev/stdout | tr f be echo foo | tee /dev/tty | tr f b. Aqui está uma dica para você: É isso teeque interpreta o /dev/stdoutnome do arquivo.
Celtschk

2
Você está certo, não sei como senti falta disso. Eu fiz alguns testes em meu próprio shell com tty e stdout e, de alguma forma, senti falta disso. Obrigado pelo esclarecimento, removi a declaração errada.
Vincent Robert

Bem, dado que o stderr não é afetado pelo canal, você não precisaria removê-lo (é claro que a advertência de redirecionamento de script permanece, mas, para um script, a redirecionabilidade geralmente é uma propriedade desejada).
Celtschk


3

Você pode usar o comando tee , apenas alimente-o com o arquivo STDERR, como exemplo:

tee /dev/stderr
tee /proc/self/fd/2

então, nesse caso, seu apelido talvez:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote

1
Eu acho que você quer dizer/proc/self/fd/2
celtschk
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.