[daemonix]
6.2. Командная строка и стандартные программы

Другой отличительной особенностью ПО UNIX является специфика работы с ним, что, опять же, является следствием истории развития системы. Бытует неправильное мнение, что ОС UNIX создавалась программистами для программистов. Это не верно хотя бы с той точки зрения, что программисты, фактически, являются тоже пользователями системы, просто немного более специфичными и ничто человеческое им не чуждо, в том числе и лень. Создаваясь изначально на многопользовательских компьютерах, где каждая минута работы в системе стоила денег, ОС UNIX намеренно развивалась так, чтобы, выполнив минимум операций, можно было получить максимум функциональности.

Это отразилось, в первую очередь, на системе команд ОС, которые, в большинстве своем, представляют сокращения или вообще аббревиатуры, вот конкретные примеры: tar - tape atchiver (ленточный архиватор), sed - stream editor (поточный редактор), ls - list (получение списка файлов), pr - print (печать файла), mt - magnetic tape manipulating program (программа управления магнитными лентами), sh - shell, command interpreter (оболочка, командный интерпретатор).

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

Этим не ограничилось совершенствование системы. Еще одним важным шагом в повышении эффективности работы, стало развитие командного интерпретатора (оболочки), в результате чего он был доведен до очень мощного инструмента. Многие знакомы с командным интерпретатором операционной системы MS-DOS (MS Windows) и знают на сколько это примитивный инструмент. Интерпретатор команд UNIX систем представляет ему прямую противоположность: он умеет правильно довершить незаконченный пользователем ввод; содержит в себе простой и одновременно мощный язык написания сценариев, значительно превосходящий аналогичную возможность интерпретатора DOS; поддерживает историю вводимых пользователем команд, имеет функцию подстановки, когда длинная команда подменяется более короткой. И это далеко не полный перечень его возможностей. Все это, вместе взятое, сделало командную строку невероятно мощным инструментом, позволяющим бысто и эффективно выполнять необходимую работу.

Работа с командной строкой в UNIX напоминает использование весьма универсального конструктора, из которого можно собрать что угодно. Например, поиск и замену слова "demon" на слово "daemon", во множестве текстовых файлов, имеющих окончание имени (в UNIX нет понятия расширения имени) ".txt", расположенных в нескольких каталогах, находящихся ниже текущего, можно выполнить единственной командой:


for file in `find . -type f -name "*.txt" -print`;
do sed s/demon/daemon/g < "$file" > "$file.tmp";
mv "$file.tmp" "$file"; done

Здесь символы "" в конце первых двух строк обозначают перевод строки без завершения ввода команды, то есть все это можно набрать и в одну строку, только без символов "". Для "нетренированного" глаза строка кажется ужасной, однако здесь все очень просто. В ней задействованы основные свойства UNIX оболочки: язык сценариев и перенаправление вывода. Главной конструкцией команды является цикл:

for переменная in список; do команда; done

Фактически, он выполняет указанную команду, для всех значений по порядку, которые может принимать переменная (file) из указанного списка. Список значений циклу поставляет команда find, а ее параметры командной строки указывают, что нужно начать поиск с текущего каталога (.), искать обычные файлы (-type f), имеющие имя начинающееся с любых символов, но заканчивающиеся на ".txt" (-name "*.txt"), а все найденное вывести на печать (-print), таким образом мы получаем список необходимых файлов. Команда, выполняемая циклом, является составной и состоит из двух операций: замены слов в файле, с записю результата во временный файл; затем замещения исходного файла временным. Первая операция выполняется потоковым текстовым редактором sed, командная строка которого указывает, что нужно найти и заменить (s) во всем файле (g) слово "demon" на "daemon" (/demon/daemon/). Данные на вход редактору передаются из очередного файла (< "$file"), здесь вместо $file интерпретатором будет подставлено реальное имя файла из списка. Результат работы редактора выводится во временный файл, который будет иметь название, аналогичное файлу оригиналу, но с добавленным в конце ".tmp" (> "$file.tmp"). После этого производится перемещение (mv), а, фактически, переименование, временного файла на место исходного. Все! Небольшая программа, написанная на языке shell (оболочки), пробежится вниз по дереву каталогов, начиная с текущего, и во всех найденных файлах осуществит требуемую замену. Правда, не страшно?


Обновлено: 12.03.2015