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
Roger Lipscombe
fonte

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.

Vincent Robert
fonte
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
4

Uma solução mais geral que /dev/tty:

start cmd:> echo foo | tee /dev/stderr 
foo
foo
Hauke ​​Laging
fonte
start cmd:> é seu $PS1?
amigos estão dizendo sobre mgalgs
@mgalgs Parte do meu PS1, sim: hauke-laging.de/software/prompt (alemão)
Hauke ​​Laging
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
MolbOrg
fonte
1
Eu acho que você quer dizer/proc/self/fd/2
celtschk