Вставить без временных файлов в 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" Я застрял на много часов, пока не сделал этого. Здесь надеемся, что этот дополнительный лакомый кусочек поможет.