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

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

[sergej@grinder sergej]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/bash2 /bin/ash /bin/bsh /bin/tcsh /bin/csh /bin/ksh /bin/zsh

Ого, а я-то думаю, куда все свободное место делось :-). В среде 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 $имя_переменной. Например:

[sergej@grinder sergej]$ echo $PATH /usr/kerberos/bin:/home/sergej/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/games:/home/sergej/bin

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

PATH=/usr/local/kde/bin:$HOME/bin:$PATH export PATH

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

export PATH="usr/local/kde/bin:$HOME/bin:$PATH"

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

[sergej@grinder sergej]$ echo $HOME/bin /home/sergej/bin

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

CDPATH=.:~:/mnt:/usr:/usr/local: export CDPATH

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

HISTIGNORE=&:ls:ls *:ps:ps *:cd *:mc:su:man *: export HISTIGNORE

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

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

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

[sergej@grinder work]$ echo $PS1 [\u@\h \W]\$ [sergej@grinder work]$ echo $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 не встречал. Пока всего лишь небольшой пример. Как быстрее создать три каталога в домашней директории? А вот так:

#mkdir ~/{video,sound,trash}

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