Вставить без временных файлов в Unix

Я пытаюсь использовать командную вставку Unix, которая похожа на добавляемую в столбец форму cat, и натолкнулась на головоломку, которую я никогда не знал, как решить в Unix.

Как вы можете использовать выходные данные двух разных программ в качестве входных данных для другой программы (без использования временных файлов)?

В идеале я бы сделал это (без использования временных файлов):

./progA> tmpA; ./progB> tmpB; вставить TMPA TMPB

Мне кажется, это встречается довольно часто, но я не могу понять, как использовать выходные данные двух разных программ (progA и progB) в качестве входных данных для другой, не используя временные файлы (tmpA и tmpB).

Для таких команд, как paste, простое использование paste $ (./ progA) $ (./ progB) (в нотации bash) не сработает, потому что оно может читать из файлов или stdin.

Причина, по которой я настороженно отношусь к временным файлам, заключается в том, что я не хочу, чтобы задания выполнялись параллельно, чтобы вызвать проблемы при использовании одного и того же файла; обеспечить уникальное имя файла иногда сложно.

В настоящее время я использую bash, но было бы любопытно увидеть решения для любой оболочки Unix.

И самое главное, я даже правильно подхожу к проблеме?


Ура!

4 ответа

Решение

Вам не нужны временные файлы под Bash, попробуйте это:

paste <(./progA) <(./progB)

См. "Замена процесса" в руководстве по Bash.

Используйте именованные каналы (FIFO) следующим образом:

mkfifo fA
mkfifo fB
progA > fA &
progB > fB &
paste fA fB
rm fA fB

Подстановка процесса для Bash делает аналогичную вещь прозрачно, поэтому используйте ее, только если у вас другая оболочка.

Боже мой, недавно я обнаружил, что в некоторых случаях вы можете заставить вашу подстановку процесса работать, если вы установите следующее внутри bash-скрипта (если вам нужно):

set + o posix

http://www.linuxjournal.com/content/shell-process-redirection

Из ссылки:"Подстановка процессов не является функцией, совместимой с POSIX, и поэтому, возможно, ее нужно будет включить с помощью: set +o posix" Я застрял на много часов, пока не сделал этого. Здесь надеемся, что этот дополнительный лакомый кусочек поможет.

Работает во всех снарядах.

{
progA
progB
} | paste
Другие вопросы по тегам