Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I pipe the output of a program that can only write to a file (and not to STDOUT)?

Tags:

linux

pipe

I'm trying to write something like Perl Audio Converter, so I need to be able to decode every relevant audio format to wav (PCM) and then encode wav to every relevant audio format. I'd like to do this in parallel, by piping the output of the decoder directly to the input of the encoder. Most decoders have an option to decode to stdout, but not all of them do. Some insist on outputting to a file.

So my question is, how can I trick a program that will only output to a specified file into using stdout instead? Also, the complementary question: how can I trick a program that requires in input file into reading from stdin?

Would this be impossible because the program might want to seek back and forth within the output?

Incidentally, Perl Audio Converter sidesteps this problem by always using an intermediate wav file, which means that it never does decoding and encoding in parallel, even for formats that support it.

PS: Yes, there's a reason I don't want to just use Perl Audio Converter, but it's not relevant to the question.

like image 634
Ryan C. Thompson Avatar asked Jan 22 '23 23:01

Ryan C. Thompson


1 Answers

On Linux, you can give /proc/self/fd/1 as a "file" output.
That should work for any program that doesn't try to seek in the output.

Some programs do seek in output (e.g. to write summary info at the start of the file once decoding is complete), and this seek will fail with anything other than a real file.

If the program checks the return value of fseek or lseek (as it should), the program will likely return an error. If it doesn't, it will likely exit successfully, but will create erroneous output (e.g. with incorrect summary info in the beginning, and extra "junk" at the end).

like image 186
Employed Russian Avatar answered Jan 29 '23 07:01

Employed Russian