Как направить вывод процесса в стандартный вывод и направить его другому процессу в bash? - PullRequest
0 голосов
/ 20 февраля 2020

Как перенаправить вывод процесса в стандартный вывод и передать в другой процесс в bash?

Я использую bash оболочку в ма c

У меня есть два python программ generate.py и sum.py

generate.py выводит целые числа в стандартный вывод.

при запуске с использованием python3 generate.py генерирует

1
2
3
4
...
...

sum.py просто потребляет вывод generate.py и сохраняет счетчик, а когда generate.py сделан, sum.py выводит окончательное значение.

однако, когда я запускаю, используя следующую команду bash

python3 generate.py >&2 | python3 sum.py Я не вижу вывод python3 sum.py

, но если я делаю это python3 generate.py | python3 sum.py, я вижу, что результат sum.py выводится на стандартный вывод, но я не вижу вывод generate.py в stdout.

, так что я смотрю на вывод как generate.py, так и sum.py при передаче данных между ними. есть идеи?

Ответы [ 3 ]

5 голосов
/ 20 февраля 2020

Используйте команду tee для разделения вашего вывода между tty и программой stdin

echo "hello" | tee /dev/tty | pbcopy

В вашем случае это будет

python3 generate.py | tee /dev/tty | python3 sum.py
2 голосов
/ 20 февраля 2020

Я предпочитаю эту команду:

( command1 | tee /dev/fd/3 | command2 ) 3>&1

Преимущество состоит в том, что весь вывод объединяется в стандартный вывод, а стандартный вывод как второй канал все еще не поврежден. Так что это может быть использовано как функция или сценарий с обычными перенаправлениями снаружи.

В переводе на ваши команды:

( python3 generate.py | tee /dev/fd/3 | python3 sum.py ) 3>&1
1 голос
/ 20 февраля 2020

Вы можете сделать это следующим образом

python3 generate.py | tee /dev/stderr | python3 sum.py

Но и "/ dev / stderr", и "/ dev / tty" являются специальным "файлом устройства", и мы должны избегать его использования таким образом.

Это проще проиллюстрировать на примере. Если мы создаем цепочечную команду с конвейером, обычное ожидание таково, что весь цепочечный конвейер будет вести себя как одна связная команда (весь конвейер принимает входную форму stdin и записывает весь вывод в stdout, а ошибки - в stderr).

Если я добавлю «| w c -l» в конце (считая количество строк), он будет ожидать, что вернет номер строки как для «generate.py», так и «sum.py» .

Но так работать не будет.

python3 generate.py | tee /dev/stderr | python3 sum.py | wc -l

Вывод w c будет только "1", что относится к одной строке из "sum.py".

О "/ dev / tty", это относится к файлу устройства "управляющего терминала". Вы можете обратиться к это для получения дополнительной информации. Но по сути это не «файл устройства», который должен использоваться для генерации вывода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...