Обратная связь в конвейере

Сначала вы используете mv, который перемещает файл, а не копирует его. Вам нужно использовать cp, но cpможет копировать несколько файлов в одно место назначения.

Вам нужно будет выполнить cpнесколько раз. Одним из решений, которое вы можете использовать, является создание простого сценария, который копирует аргумент в несколько мест назначения. Затем в вашей команде find.. -exec {}запустите скрипт с файлом в качестве аргумента и скопируйте его несколько раз внутри вашего скрипта.

4
13.11.2017, 19:14
1 ответ

Нет. Конвейер — это -односторонний канал связи. Вот почему это называется «конвейером»; вы не смогли бы отправить нефть обратно по трубопроводу, даже если бы попытались.

Однако, если bar.js также должен взаимодействовать с foo.js, у вас есть несколько вариантов:

  • Создайте доменный сокет unix вместо конвейера и запустите foo.jsи bar.jsпо отдельности (, т. е. больше не передавайте вывод foo.js в bar.js ). Я не знаю, как вы это делаете из узла, но, по сути, сокет домена unix — это сетевой сокет, который использует имена файлов, а не IP-адреса, и работает внутри ядра. Сокеты предназначены для двунаправленной связи, но требуют большей настройки, чем простой канал (, например, прослушивающий сокет может взаимодействовать с несколькими экземплярами bar.js ). Вы можете найти сокеты домена unix в файловой системе, но это не является строго необходимым (, и действительно, Linux позволяет создавать сокет домена unix без следа в файловой системе ).
  • Используйте mkfifoдля создания именованного канала (или используйте какой-либо API узла для его создания, если он существует; опять же, я не знаю узел ). Затем в foo.jsоткройте этот именованный канал и прочитайте из него. Ваш скрипт bar.jsможет открывать тот же именованный канал и писать в него.

К последнему будет проще всего перейти, так как вы по-прежнему используете файловый ввод-вывод (открытие именованного канала требует открытия файла в файловой системе ), но все равно будет однонаправленным (, хотя вы иметь два канала, по одному в каждом направлении ). Первый немного чище, а также позволяет вам легче перенести один из двух сценариев на другой хост, если это когда-либо понадобится.

В любом случае, если ваши сценарии теперь взаимодействуют в двух направлениях, то для ясности я бы посоветовал вам запускать их как отдельные процессы, а не связывать один процесс с другим. ИМХО, теперь они равноправные партнеры, и ваша командная строка должна показать это. Это всего лишь деталь, и, конечно, технически не требуется.

5
27.01.2020, 20:52

Теги

Похожие вопросы