Возможно, вы слишком сильно сократили свой пример, но вы можете просто сделать:
cat input.txt | command arg1 arg2 <(command2 input.txt) arg3 <(command3 input.txt) arg4
Или без кота.
<input.txt command arg1 arg2 <(command2 input.txt) arg3 <(command3 input.txt) arg4
Но, возможно, перед каналом есть очень сложная команда.Тем не менее, почему бы не сперва сохранить это в файле и выполнить вышеописанное?
Тем не менее, возможно, вывод очень большой, и вы не хотите записывать его в файловую систему.Затем вы можете использовать именованные каналы, но есть одна загвоздка.
mkfifo input{1..3} # makes input1, input2, input3 as named pipes (!! named are still part of the file system !!)
complexcommand | tee input{1..3} & # tee will hang till it can send its output, therefor move it to the background with &
<input1 command arg1 arg2 <(command2 <input2) arg3 <(command3 <input3) arg4
rm -f input{1..3} # Since named pipes are part of the filesystem, better cleanup.
Подвох: приведенная выше информация может работать или не работать в зависимости от поведения команд.Это работает, только если команда, команда2 и команда3 обрабатывают данные одновременно.Таким образом, в этом случае, если «команда» решит, что ей нужны все данные из <(command2 <input2)
, прежде чем читать какие-либо данные из <input1
, она будет ждать вечно, потому что строка отправляется только в том случае, если ее запрашивают команда, command2 и command3,