Оболочка: взаимный трубопровод STDIN / STDOUT двух команд

Когда мы запускаем это с помощью оболочки POSIX,

$ cmd0 | cmd1 

STDOUT из cmd0 передается по трубопроводу в STDIN из cmd1.

Q: Вдобавок к этому, как я могу также передать STDOUT из cmd1 в STDIN из cmd0?

Обязательно ли использовать перенаправление из / в именованный канал (FIFO)? Мне очень не нравятся именованные каналы, потому что они занимают несколько путей к файловой системе, и мне нужно беспокоиться о столкновениях имен. Или мне нужно вызвать pipe (2) через C, Python или некоторые языки программирования общего назначения?

(Оба cmd0 и cmd1 выполняют некоторые сетевые операции ввода-вывода, поэтому они не будут блокировать друг друга навсегда.)

  • Awk не дает никакого результата
  • Удаление старых файлов в каталоге, кроме файлов, присутствующих в файле исключений
  • Как выбрать уникальные значения массива?
  • Сценарий для перемещения одного типа файлов и создания подпапки, если он существует?
  • Разработка сценария bash с использованием переменных
  • добавить новую строку в файл с разделителями
  • gnu параллельно с ffmpeg не обрабатывает первый файл
  • Как запустить скрипты MYSQL из сценария оболочки с переменными bash?
  • One Solution collect form web for “Оболочка: взаимный трубопровод STDIN / STDOUT двух команд”

    В системах с двунаправленными трубами (не Linux) вы можете:

     cmd0 <&1 | cmd1 >&0 

    В Linux вы можете:

     { cmd0 < /dev/fd/3 | cmd1 3>&-; } 3>&1 | : 

    Это работает, потому что в Linux (и только для Linux) /dev/fd/x где x является fd для канала (с именем или нет), действует как именованный канал, то есть, открывая его в режиме чтения, вы получаете конец чтения и в режим записи дает вам конец записи.

    С помощью оболочки yash и ее x>>|y оператора перенаправления трубопровода :

     { cmd0 <&4 3<&- 4<&- | cmd1 >&3 3>&- 4>&-; } 3>>|4 

    С оболочками с поддержкой coproc :

    • ЗШ:

        coproc cmd0 cmd1 <&p >&p 
    • КШ

        cmd0 |& cmd1 <&p >&p 
    • bash4 +

        coproc cmd0 cmd1 <&"${COPROC[0]}" >&"${COPROC[1]}" 

    Некоторые посвященные инструментальные подходы (бесстыдно скопированные из ответов на этот очень похожий вопрос ):

      pipexec [A / path / to / cmd0] \
             [B / путь / в / cmd1] \
             '{A: 1> B: 0}' '{A: 0> B: 1}' 

    Или:

      dpipe cmd0 = cmd1 

    Или:

      socat EXEC: cmd0 EXEC: cmd1, nofork # с помощью сокетов
     socat EXEC: cmd0, текст = трубы EXEC: cmd1, nofork # с использованием труб 

    Я не знаю о python , но это также относительно легко делается в perl :

     perl -e 'pipe STDOUT,STDIN; exec "cmd0 | cmd1"' 

    В любом случае, остерегайтесь взаимоблокировок!

    Interesting Posts

    Выбор правильного установщика Debian

    проблема с установкой mandoc

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

    Обратный pkg-config?

    Добавьте ведущие нули, пока все строки перед запятой не состоят из девяти символов и затем вставьте символ каждые три цифры, используя sed

    как смонтировать хранилище центров обработки данных на сервере, чтобы пользователь мог получить к нему доступ удаленно?

    Как проверить и заблокировать процессы, напрямую связанные с Интернетом?

    изменение домашнего каталога пользователя не влияет

    использовать документацию R на локальном веб-сервере

    Как изменить текущий каталог графически только с помощью клавиатуры?

    Как я могу определить, какое индивидуальное ограничение ulimit имеет процесс?

    openSUSE: переключение с Wicked на NetworkManager с помощью командной строки

    Отправка новых журналов регистрации и выхода из системы в базу данных

    Почтовый сервер CentOS 6.4

    Как удалить соответствующие строки из одного текстового файла с помощью другого?

    Linux и Unix - лучшая ОС в мире.