Перенаправление ввода / вывода в 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 присоединилась к клубу. У вас есть несколько вариантов:
Используйте функцию подстановки процессов в Bash следующим образом:
exec 3> >(nc localhost 9999)
Если вы делаете это в интерактивном режиме, вы, вероятно, захотите сделать это, если больше не хотите перенаправлять на сокет TCP:
exec 3> /dev/null
Это должно вызвать
nc
процесс порожден, чтобы выйти.Скомпилируйте ваш собственный bash с включенной поддержкой псевдо-файлов /dev/tcp и /dev/udp и используйте ее.
Измените ваш сценарий, чтобы направить вывод непосредственно в
nc
команда вместо Это может быть проблемой, если ваш сценарий перенаправляет вывод в файловый дескриптор 3 несколько раз, а процесс прослушивания неправильно обрабатывает несколько попыток подключения. Тем не менее, он также более переносим, если вам нужно использовать ваш скрипт в системе, которая не обеспечивает оболочку Bash.