Подтвердить что ты не робот

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

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

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

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

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

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

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

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

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

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


Ура!

4b9b3361

Ответ 1

Вам не нужны временные файлы под bash, попробуйте следующее:

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

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

Ответ 2

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

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

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

Ответ 3

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

set + o posix

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

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

Ответ 4

Работает во всех оболочках.

{
progA
progB
} | paste