Если бы, отправляясь в изгнание на необитаемый остров, я должен был выбирать между IDE и набором инструментов UNIX, я бы, не колеблясь, выбрал утилиты UNIX. Вот причины, по которым следует овладеть искусством работы с утилитами UNIX.
Во-первых, IDE ориентированы на конкретные языки, а утилиты UNIX могут работать с любым материалом в текстовом виде. В современных условиях разработки, когда новые языки и нотации появляются каждый год, затраты на изучение работы с утилитами UNIX окупятся многократно.
Кроме того, IDE предлагают только те команды, которые решили реализовать их создатели, тогда как средствами UNIX можно выполнить любую мыслимую задачу. Их можно представить себе как классические (до появления Bionicle) блоки Lego: вы создаете собственные команды, просто комбинируя маленькие, но универсальные утилиты UNIX. К примеру, следующая последовательность представляет собой текстовую реализацию анализа сигнатуры по Каннингему — последовательность использования точки с запятой, фигурных скобок и кавычек в любом файле может многое сказать о его содержимом:
for i in *.java; do
echo — n "$i: "
sed ’s/[~"{};]//g' $i | tr — d '\n'
echo
done
Далее, каждая изученная вами операция IDE специфична для данной задачи, например добавление нового шага в конфигурацию отладочной сборки проекта. Напротив, более глубокое изучение утилит UNIX повышает вашу эффективность при решении любых задач. Например, я применил утилиту sed, использованную в приведенной выше последовательности команд, чтобы преобразовать процедуру сборки проекта для кросскомпиляции на многопроцессорных архитектурах.
Утилиты UNIX были разработаны в ту эпоху, когда многопользовательские компьютеры располагали ОЗУ размером в 128 Кбайт. При их создании была проявлена такая изобретательность, что сейчас они могут очень эффективно обрабатывать огромные наборы данных. Большинство утилит представляет собой фильтры, обрабатывающие по одной строке за раз, а потому нет верхней границы объема данных, которые они могут обработать. Вы хотите узнать, сколько редакций хранится в дампе английской Википедии, имеющем размер полтерабайта? Простой вызов команды
grep ‘ ’ | wc — l
без труда даст вам ответ. Если какая-то последовательность команд покажется вам полезной в общем случае, можно создать на ее основе сценарий интерпретатора команд, применив в нем некоторые исключительно мощные программные конструкции, такие как направление данных в циклы и условные операторы. Еще более впечатляет, что конвейерное выполнение команд UNIX (как в предыдущем примере) естественным образом распределяет нагрузку по нескольким конвейерам обработки современных многоядерных процессоров.
Принцип «прекрасное в малом» и открытость реализаций утилит UNIX делают их доступными повсеместно, даже на платформах с ограниченными ресурсами, таких как медиа-проигрыватель, подключаемый к телевизору, или маршрутизатор DSL. Такие устройства едва ли располагают мощным графическим интерфейсом пользователя, но часто содержат приложение BusyBox, предлагающее наиболее часто используемые утилиты. Если вы занимаетесь разработкой под Windows, среда Cygwin предложит вам все мыслимые утилиты UNIX как в виде исполняемых файлов, так и в виде исходного кода.
Наконец, если вас не удовлетворяют существующие утилиты UNIX, вы можете легко расширить их набор. Напишите программу, которая решает нужную вам задачу, на любом понравившемся вам языке, соблюдая следующие простые правила: программа должна выполнять одну единственную задачу, читать данные со стандартного ввода в виде строк текста и печатать результат на стандартный вывод без всяких заголовков и прочих украшательств. Параметры, влияющие на функционирование утилиты, задаются в командной строке. Следуйте этим правилам, и тогда «Земля — твое, мой мальчик, достоянье».