Назад | Перейти на главную страницу

Перенаправление ввода-вывода в 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, но сейчас он не работает, давая мне ответ «Плохой дескриптор файла». У кого-нибудь есть идеи?

Перенаправление на псевдо-файлы / 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.