/ / Redirecionar a saída do arquivo para stdout - bash, shell, unix, stdout

Redirecionar a saída do arquivo para stdout - bash, shell, unix, stdout

Eu tenho um programa que pode produzir seus resultados apenas para arquivos, com -o opção. Desta vez eu preciso de saída para consolar, ou seja stdout. Aqui está minha primeira tentativa:

myprog -o /dev/stdout input_file

Mas diz:

/ dev / não gravável

Encontrei essa questão que é semelhante ao meu, mas /dev/stdout obviamente não vai funcionar sem alguma mágica adicional.

P: Como redirecionar a saída do arquivo para stdout?

P.S. Métodos convencionais sem qualquer software especializado são preferíveis.

Respostas:

5 para resposta № 1

Muitas ferramentas interpretam - como stdin / stdout dependendo do contexto de seu uso. No entanto, isso não faz parte do shell e, portanto, depende do programa usado.

No seu caso, o seguinte poderia resolver o seu problema:

myprog -o - input_file

4 para resposta № 2

Se o programa só puder gravar em um arquivo, você poderá usar um pipe nomeado:

pipename=/tmp/mypipe.$$
mkfifo "$pipename"

./myprog -o "$pipename" &

while read line
do
echo "output from myprog: $line"
done < "$pipename"

rm "$pipename"

Primeiro criamos o tubo, colocamos em /tmp para mantê-lo fora do caminho de programas de backup. o $$ é o nosso PID e torna o nome único em tempo de execução.

Nós rodamos o programa em segundo plano, e deveriabloco tentando escrever para o tubo. Alguns programas usam uma técnica chamada "mapeamento de memória", caso em que isso falhará, porque um pipe não pode ser mapeado na memória (um bom programa verificaria isso).

Então nós lemos o pipe no script como faríamos com qualquer outro arquivo.

Finalmente, deletamos o pipe.


2 para resposta № 3

Você pode cat o conteúdo do arquivo escrito por myprog.

myprog -o tmpfile input_file && cat tmpfile

Isso teria o efeito descrito - permitindo que você canalize a saída de myprog para algum comando subseqüente - embora seja uma abordagem diferente da que você imaginou.

Na circunstância de que a saída de myprog (talvez mais apropriadamente notmyprog) é grande demais para gravar em disco, essa abordagem não seria boa.

Uma solução que limpe o arquivo temporário na mesma linha e ainda canalize o conteúdo no final seria essa

myprog -o tmpfile input_file && contents=`cat tmpfile` && rm tmpfile && echo "$contents"

Que armazena o conteúdo do arquivo em uma variável para que possa ser acessado após a exclusão do arquivo. Observe as aspas no argumento do echo comando. Estes são importantes para preservar novas linhas no conteúdo do arquivo.