Перенаправление ввода / вывода в OS X Lion

У меня есть скрипт, который раньше работал, который основывается на отправке команд (имена файлов, которые должны быть обработаны фактически) процессу, прослушивающему порт, используя TCP. Так что я могу запустить его и сказать, чтобы он слушал, скажем, порт 9999.

Для быстрого взлома я бы затем настроил перенаправление потока на порт 9999, используя такую ​​команду:

exec 3<> /dev/tcp/127.0.0.1/9999

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

find . -name "*.xml" -exec printf "$PWD/{} $PWD/{}\r\n" >&3 \;

Я не пробовал этого с тех пор, как обновился до Lion, но теперь он не работает, давая мне ответ "Плохой дескриптор файла". У кого-нибудь есть идеи?

1 ответ

Решение

Перенаправление в псевдофайлы /dev/tcp и /dev/udp - это дополнительная функция компиляции Bash, которую многие производители ОС предпочитают оставлять отключенной. Похоже, Apple присоединилась к клубу. У вас есть несколько вариантов:

  1. Используйте функцию подстановки процессов в Bash следующим образом: exec 3> >(nc localhost 9999)

    Если вы делаете это в интерактивном режиме, вы, вероятно, захотите сделать это, если больше не хотите перенаправлять на сокет TCP: exec 3> /dev/null

    Это должно вызвать nc процесс порожден, чтобы выйти.

  2. Скомпилируйте ваш собственный bash с включенной поддержкой псевдо-файлов /dev/tcp и /dev/udp и используйте ее.

  3. Измените ваш сценарий, чтобы направить вывод непосредственно в nc команда вместо Это может быть проблемой, если ваш сценарий перенаправляет вывод в файловый дескриптор 3 несколько раз, а процесс прослушивания неправильно обрабатывает несколько попыток подключения. Тем не менее, он также более переносим, ​​если вам нужно использовать ваш скрипт в системе, которая не обеспечивает оболочку Bash.

Другие вопросы по тегам