Трубный ввод для двух технологических замен с использованием тройника - PullRequest
0 голосов
/ 15 февраля 2019

Можно ли связать входные данные с двумя заменами процесса?Можно ли это сделать с тройником?Не удалось найти решение.

У меня есть команда, которую я хочу выполнить, используя такие подстановки процессов:

cat input.txt | command arg1 arg2 <(command2 </dev/stdin) arg3 <(command3 </dev/stdin) arg4

Я пытаюсь передать входные данные через канал вcommand2 и command3, но я обнаружил, что вы не можете читать из канала дважды.

Если это возможно, какой правильный синтаксис для этого можно сделать с tee?

1 Ответ

0 голосов
/ 15 февраля 2019

Возможно, вы слишком сильно сократили свой пример, но вы можете просто сделать:

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,

...