Existe uma maneira de ler a saída do console de um comando sem redirecionar ou canalizar seu STDOUT/STDERR?
O problema com redirecionamentos ou pipes é que alguns comandos se comportam de forma diferente quando seus STDOUT e/ou STDERR são redirecionados, por exemplo, cor ou algum formato é removido, ou diferenças mais relevantes. Versões mais tput
antigas requerem STDOUT ou STDERR em um console regular para ler suas dimensões. No caso de pipes, adicionalmente, o comando originating perde a capacidade de controlar o shell de origem, por exemplo, exit
um script de dentro de uma função, que tem sua saída canalizada, não é possível.
O que eu quero conseguir é executar um comando para que ele imprima sua saída no console diretamente, seja capaz de matar/sair do shell, mas analisar/manipular e, no caso, registrar sua saída. tee
seria uma solução óbvia, mas sofre dos problemas mencionados.
Fiz algumas tentativas com read
, executando um loop que tenta ler os descritores de arquivo do comando ou /dev/stdout
ou /dev/tty
, mas em todos os casos, nem uma única linha da saída do comando mostrado é realmente read
.
Por exemplo
#!/bin/bash
apt update 2>&1 & pid=$!
while [[ -f /proc/$pid/fd/1 ]] && read -r line
do
echo "$line" >> ./testfile
done < /proc/$pid/fd/1
mas também executando o loop while em segundo plano e o comando em primeiro plano (IMO preferível), como:
#!/bin/bash
while read -r line
do
echo "$line" >> ./testfile
done < /dev/tty & pid=$!
apt update
kill $pid
mas em ambos os casos ./testfile
permanece vazio.
/dev/stdout
é o próprio descritor de arquivo STDOUT de cada processo, que não pode funcionar, é claro.
Provavelmente alguém tem uma idéia de como conseguir isso ou uma alternativa semelhante?