Gostaria de canalizar a saída padrão de um programa, mantendo-o na tela.
Com um exemplo simples ( echo
use aqui é apenas para fins ilustrativos):
$ echo 'ee' | foo
ee
<- a saída que eu gostaria de ver
Eu sei que tee poderia copiar stdout para arquivo, mas não é isso que eu quero.
$ echo 'ee' | tee output.txt | foo
Eu tentei,
$ echo 'ee' | tee /dev/stdout | foo
mas ele não funciona, pois a saída do tee /dev/stdout
é canalizada parafoo
echo 'ee' | tee /dev/stderr
funciona, portanto, se o seu requisito "na tela" também for atendido pelo stderr, isso funcionará.Respostas:
Aqui está uma solução que funciona em qualquer implementação Unix / Linux, assumindo que ela se preocupa em seguir o
POSIX
padrão. Também funciona em alguns ambientes não Unixcygwin
.Referência: The Open Group Base Specifications Edição 7 IEEE Std 1003.1, 2013 Edition, §10.1 :
Foi relatado que alguns ambientes como o Google Colab não implementam
/dev/tty
enquanto ainda têm seutty
comando retornando um dispositivo utilizável. Aqui está uma solução alternativa:ou com uma concha Bourne antiga:
fonte
/dev/tty
é um dispositivo Unix obrigatório. Você está correndo em uma prisão BSD?tee
assim:cat some.log | tee /dev/tty | tee -a other.log | grep -i 'foo' >> foo.log
para 1) colocar tudo no console, 2) colocar tudo anexado a outro arquivo, 3) colocar asfoo
linhas em um arquivo diferente./dev/tty
, mas a saída detty
é utilizável.Outra coisa a tentar é:
O
>(foo)
é uma substituição de processo .fonte
foo
terá que fazer parte da substituição do processo. Aqui está um exemplo:echo 'ee' | tee file.txt >(wc -c | tr -d ' ')
echo 'ee' | tee >(cat) | foo | bar
.O acesso a "/ dev / stdout" é negado em alguns sistemas, mas o acesso ao terminal do usuário é dado por "/ dev / tty". Usando "wc" para "foo", os exemplos acima funcionam bem (no linux, OSX, etc.) como:
Para adicionar uma contagem na parte inferior de uma lista de arquivos correspondentes, uso algo como:
% ls [A-J]* | tee /dev/tty | wc -l
Para evitar ter que lembrar de tudo isso, defino aliases:
% alias t tee /dev/tty
% alias wcl wc -l
para que eu possa simplesmente dizer:
% ls [A-J]* | t | wcl
fonte
Experimentar:
Se o uso do stderr é uma opção, é claro.
fonte
primeiro, você precisa descobrir o terminal associado à sua tela (ou a tela em que deseja que a saída seja exibida):
então você pode conectar a saída a esse terminal e canalizar a outra cópia através do seu programa foo:
fonte
t
é inútil. Você pode usar,echo ee | tee $(tty) | foo
mas ele ainda possui um comando inútil (tty
), dado que/dev/tty
simplesmente funciona.