Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Bourn'ый гений

©51(222)/23.12.2002

Сергей ЯРЕМЧУК grinder@ua.fm

Сегодня работа в Unix выглядит совсем иначе, чем лет этак десять-пятнадцать назад. Графический интерфейс, системы меню, drag-and-drop - все это сказалось на характере общения пользователя с системой. Нынешние юниксы даже внешние мало чем отличаются от Windows, уж простите за такое сравнение :-). Но взглянув на рабочий стол любого более-менее продвинутого юниксоида, всегда найдете там хотя бы одно окно терминала. Может быть, поначалу кажется, что это неудобно, да еще и команды необходимо запоминать, но со временем, когда появляются любимые приложения, начинаешь замечать, что запустить их легче и быстрее с командной строки. Консольные программы работают быстрее и к системным ресурсам относятся поэкономней, чем их оконные собратья. Последние в большинстве своем являются лишь фронт-эндом к консольным утилитам. В данной статье попробуем немного скрасить и упростить свое пребывание в командной строке.

Поначалу хочется отметить, что командный интерпретатор, используемый в любой Unix-системе, гораздо сложнее и функциональнее, чем command.com из MS-DOS, к тому же играет куда более важную роль в управлении системы. Может быть поэтому с появлением Windows про command.com практически забыли. Но юниксоиды интерпретатор чаще называют оболочкой (shell). Это название произошло оттого что в системе приняты различные уровни работы операционной системы. Так, различают внутренние функции ядра и внешние, вызываемые пользователем. Но ядро имеет очень сложную структуру и свой набор команд, чтобы разобраться со всем этим, необходимо иметь довольно серьезную подготовку, к тому же и удобство, понимаете, и безопасность. Поэтому ядро облачили в удобную и красивую одежку, а по-простому оболочку - shell. Которая и берет на себя все заботы при взаимодействии пользователя с ядром: выполнение пользовательских команд, предотвращение выполнения ненадежного и опасного для системы кода, поиск и запуск программ и много-много других функций. Но и интерпретаторов для Unix существует довольно приличное количество. Список всех установленных в системе можно получить, просмотрев файл /etc/shells. Например:

Ого, а я-то думаю, куда все свободное место делось :-). В среде Linux по умолчанию используется интерпретатор bash, если кто использует в своей работе FreeBSD, то в этой системе вас первым встретит tcsh. На различиях останавливаться в этот раз не будем. Пользователю обычно хватает возможностей, предоставляемых bash (Bourne Again Shell), поэтому на нем и остановимся. К тому же компания Red Hat недавно объявила, что создает интерпретатор, совмещающий положительные стороны всех имеющихся в природе, что, однако, вызвало критику со стороны старожилов Unix. Поживем, увидим, что получится.

При запуске командный интерпретатор bash последовательно считывает следующие конфигурационные файлы: /etc/profile, ~/.bash_profile, ~/.bashrc, а в конце работы считывается файл ~/.bash_logout. В этих файлах устанавливаются необходимые для работы значения переменных среды bash. Также некоторые параметры связанные с раскладкой клавиатуры устанавливаются в файлах /etc/inputrc и ~/inputrc. Давайте рассмотрим некоторые интересные и полезные переменные. Узнать значения, уже установленные в интерпретаторе, можно, воспользовавшись командой printenv. Довольно часто, набрав какую-либо программу, в ответ получаем command not found т.е. система не может найти исполняемый файл. Для поиска каталогов с программами используется переменная PATH (переменные в bash пишутся заглавными буквами). Проверить отдельно установленное значение можно, набрав echo $имя_переменной. Например:

Как видите, чтобы обратиться к значению переменной, перед ее именем необходимо поставить знак некоей условной единицы - $. Но например, программа Quanta устанавливается по умолчанию в каталог /usr/local/kde/bin/, т.е. просто набрав quanta в данном примере, получим то же сообщение, в противном случае придется каждый раз набирать полный путь для запуска программы, что, согласитесь, не совсем удобно. Поэтому для удобства добавим этот каталог в переменную. Ее значение устанавливается в файле /etc/profile, в котором все необходимые каталоги перечисляются через двоеточие (:), но в системные файлы лезть не будем, поэтому допишем в домашнем файле ~/.bash_profile такие строки:

Кстати, можно сразу загрузить переменную, введя для этого:

Экспортирование значения переменной необходимо для того чтобы ее значение было доступно всей среде, а не текущему процессу. Еще один момент: кто работал в DOS, наверное, помнит, что поиск программы на исполнение начинается с каталога, в котором на данный момент находится пользователь. В Unix же необходимо каждый раз явно указывать на текущий каталог. Вот так: # ./my_program. Некоторые находят это не совсем удобным. Для того чтобы интерпретатор каждый раз искал программу и в текущем каталоге, необходимо явно указать его в переменной PATH. Сделать это очень просто: поставьте точку, отделив ее, естественно, от остальных двоеточием. Но если на домашнем компьютере это может облегчить работу, то при работе на общедоступном сервере не делайте так ни в коем случае. Почему? А потому что злоумышленник может написать скрипт, ворующий файлы с паролями, или добавляющий нового пользователя в систему, или делающий еще какую гадость. И затем положить его в общедоступный каталог, например /tmp, и, главное, назвать его как-нибудь безобидно, например cat. И теперь есть вероятность того, что суперпользователь, находясь в этом каталоге, наберет саt, и если текущий каталог в переменной PATH находится раньше, чем в /bin, запустится эта зловредная программа. Можно, конечно, прописать текущий каталог последним, но вероятность запуска чужой программы при этом все равно остается. В приведенном примере мы встретили еще одну переменную HOME, указывающую на домашний каталог пользователя; при ее считывании произойдет подстановка значения, и на выходе в данном случае получим:

Кстати, удачное место для пользовательских программ. Еще одна переменная, помогающая быстро перейти в другой каталог, - CDPATH. Она выполняет действия, подобные PATH, но для команды cd (change directory). Вспомните, сколько раз, помня название конечного каталога, мы пытались найти промежуточные, чтобы попасть в него. Но установив ее значение примерно так:

Теперь в каталог $HOME/work я могу попасть из любой точки системы, просто набрав # cd work. Как вы знаете, bash поддерживает историю команд - о том, как установить максимальное значение сохраняемых команд с помощью HISTSIZE и HISTFILESIZE, уже писал в своей статье Петр Семилетов. Но есть одно маленькое неудобство, а именно: в этот файл записываются все команды, введенные пользователем, т.е. все ваши перемещения с помощью команды cd, вывод содержимого каталога с помощью ls и просмотр списка процессов с помощью ps тоже заносятся в данный файл, а так как это наиболее часто используемые команды, то они заполняют большую часть файла, хоть в большинстве случаев данные команды меньше всего интересуют пользователя. Поэтому часто приходится долго и нудно пролистывать историю команд с помощью стрелки вверх. Так вот, для того чтобы не все команды попадали в этот список, существует переменная HISTIGNORE. Запишите такую строку в файл ~/.bash_profile:

Остальные команды подберите сами, посмотрев с помощью history самые бесполезные.

Пользователю root желательно воспользоваться переменной TMOUT, отключающей терминал при бездействии в течение определенного времени.

Очень часто пользователям не нравится приглашение командного интерпретатора, и возникает естественное желание его изменить. Пожалуйста - здесь возможно если не все, то многое; приглашению также соответствует своя переменная. Но вы скорее всего удивитесь, когда узнаете, что в bash используется аж четыре вида приглашений. Второе приглашение используется, когда вы нажмете клавишу Enter, синтаксически не закончив при этом ввод команды. С третьим и четвертым разберетесь сами, их встречают еще реже. Так вот, за вид первых двух отвечают переменные PS1 и PS2 соответственно. Давайте посмотрим, что даст их вывод:

Если сопоставить вывод команды и шаблон, то получится, что знаку \u соответсвует имя пользователя, \h - имя узла, \W - текущий каталог. Некоторые интересные опции приведены в таблице, остальные - в man bash.

Так же, как и в любую другую переменную, в PS* можно подставить результат выполнения команды: PS1=`uname`"$" выведет Linux$.

Про переменные на сегодня все, а то не хватит места для всего остального. Есть еще одна удобная штука в bash, о которой все говорят, но почему-то мало кто использует - присвоение псевдонимов командам. Прописать их можно в файле .bashrc. Формат записи такой: alias rm='rm -i'; теперь после перезапуска будет запрашиваться подтверждение на удаление файла, когда вы просто введете rm (без этого данная команда удаляет файлы молча, что не есть безопасно). В некоторых случаях требуется, чтобы файл удалялся безвозвратно - у команды rm есть опция -P, при которой файл записывается три раза в случайной последовательности, и тогда уж точно никакая утилита не сможет его восстановить. Если посмотреть внимательно на опции большинства команд, то можно найти универсальные; я их нашел пока четыре: -h - помощь, -i - запуск в интерактивном режиме, когда программа запрашивает подтверждение на действие, -v - информационный режим, когда программа выводит отчет о каждом своем действии, -f - режим безоговорочного Табл. 1выполнения программы. Кстати, загляните обязательно в этот файл - там уже наверняка есть готовые псевдонимы. Но обычно на них успокаиваются, и очень даже зря. Кто сейчас вспомнит, как очистить диск CD-RW? А я набираю просто #clearrw. И все, ни одного лишнего удара по клавиатуре, и самое главное, быстро вспоминается, когда нужно. Добавьте следующие строки в файл: alias clearrw='cdrecord -blank=all dev=0,0'.

Bash, как и практически любая программа в Unix, поддерживает работу с регулярными выражениями. Это, пожалуй, отдельная тема - такого размаха я, честно говоря, в Windows не встречал. Пока всего лишь небольшой пример. Как быстрее создать три каталога в домашней директории? А вот так:

(Продолжение следует)