Полезная информация

ГЛАВА 7

КОМАНДЫ И ПЕРЕМЕННЫЕ ИНТЕРПРЕТАТОРОВ КОМАНДНОЙ СТРОКИ

Интерпретатор командной строки (shell) является командой, такой же, как и любая другая команда UNIX. Если вы уже просмотрели главу 5, то вы заметили, что С shell. Bourne shell и Korn shell приведены там наравне с другими командами. Все эти три интерпретатора командной строки выполняют одну и ту же функцию: они переводят ваши команды в инструкции, которые понимает операционная система. Когда вы входите в UNIX-систему, автоматически запускается интерпретатор командной строки. Без него вы не смогли бы сделать абсолютно ничего.

Как мы отмечали в главе 1, интерпретатор командной строки использует специальный символ, чтобы показать, что он готов к работе и ожидает вашего ввода. Bourne и Korn shell используют знак доллара ($), а С shell - знак процента (%). (Если вы привилегированный пользователь, в качестве подсказки будет использоваться диез- #.)

После входа пользователя в систему интерпретатор командной строки выполняет некоторые действия по инициализации внутренних переменных, называемых переменными окружения.

В этой главе описываются наиболее важные переменные интерпретаторов командной строки, а также некоторые команды. Мы не собираемся описывать все переменные и все команды. Изучение такой темы под силу лишь подготовленному пользователю. Если вам понадобится дополнительная информация, вы всегда сможете найти ее в каком-нибудь учебном руководстве по UNIX.


Переменные Bourne shell и Кот shell

Bourne shell - интерпретатор командной строки, использовавшийся. в UNIX с момента появления этой операционной системы. Более современный Korn shell был разработан как улучшение Bourne shell и включил в себя несколько полезных возможностей С shell (например, историю командной строки), однако общая структура интерпретатора осталась неизменной.

Переменные, описанные ниже, работают и в Bourne shell, и в Korn shell, если только явно не оговорено обратное. Приводимый список не является полным списком переменных, но содержит наиболее значимые и часто используемые. За дополнительной информацией о переменных интерпретаторов командной строки обратитесь к документации вашей операционной системы.

Переменная Значение

CDPATH Эта переменная содержит список каталогов, в которых интерпретатор будет искать подкаталог при смене текущего каталога. Например, если ваш файл .profile содержит строку CDPATH=/usr/users /kevin/data, то для перехода в подкаталог каталога /usr/users/kevin/data вам не нужно будет указывать полный путь к нему. Эта переменная может содержать список из нескольких каталогов, которые в таком случае должны быть отделены друг от друга двоеточием

COLUMNS (Korn shell) Эта переменная содержит длину строки вашего монитора. По умолчанию - 80

EDITOR (Korn shell) Эта переменная содержит название текстового редактора, который будет использоваться по умолчанию (обычно это emacs или vi). Некоторые команды и программы вызывают редактор, указанный в этой переменной


ENV (Korn shell) Эта переменная содержит имя файла настроек интерпретатора командной строки (обычно это .kshrc)

HISTSIZE (Korn shell) Эта переменная определяет размер списка, в котором хранится история командной строки. История хранит отданные вами команды; в любой момент вы можете сослаться на одну из предыдущих команд по ее номеру

HOME Когда вы входите в систему, вашим текущим каталогом немедленно становится ваш домашний каталог, полное имя которого хранится в данной переменной. Вы можете в любой момент вернуться в домашний каталог, использовав команду cd без параметров

IFS Название этой переменной - сокращение от Internal Fileld Separator - внутренний разделитель полей. По умолчанию в командной строке для отделения объектов друг от друга используются пробел, символ табуляции и символ перевода строки. Если вы установите знак & в качестве значения переменной IFS, для отделения имен файлов, команд и параметров друг от друга интерпретатор командной строки станет использовать этот символ

LOGNAME (Korn shell) В этой переменной хранится ваш системный идентификатор

MAIL В этой переменной хранится полное имя вашего почтового ящика, в который mailx или другая почтовая программа, которую вы используете, будет переправлять всю входящую почту

MAILCHECK Значение этой переменной указывает интерпретатору командной строки, как часто следует проверять наличие новой почты (по умолчанию это происходит один раз в


десять минут). Переменная должна содержать интервал между проверками в секундах. Например, значение MAILCHECK= 3600 означает, что проверка на наличие новой почты будет производиться каждый час, а MAILCHECK=0 - что проверка будет производиться каждый раз, как на экран выводится приглашение командной строки (это не самый эффективный способ использования ресурсов вашего компьютера)

MAILPATH Эта переменная позволяет определить несколько почтовых ящиков

PATH Эта переменная содержит путь поиска

файлов. Большинство часто используемых программ находится в небольшом количестве каталогов, что позволяет указать системе, где их надо искать. В противном случае вам пришлось бы каждый раз тратить кучу времени, отыскивая нужную программу в большой файловой структуре

PS1 Эта переменная содержит приглашение командной строки

PS2 Эта переменная содержит дополнительное приглашение командной строки (по умолчанию >), которое используется, когда команда занимает более одной строки

SHELL Эта переменная устанавливает дополнительный интерпретатор командной строки. который будет использоваться такими программами, как vi или ed

TERM Эта переменная содержит тип терминала. Например, TERM=VT100 соответствует распространенному типу терминала VT100

TERMINFO (Korn shell) Эта переменная содержит информацию о терминале, хранящуюся в базе данных /usr/lib/terminfo

TMOUT (Korn shell) Эта переменная содержит время тайм-аута (в секундах). При неактивности пользователя в течение данного времени он отключается от системы


TZ (Korn shell) Эта переменная определяет часовой пояс. Ее значение используется командой date

ПРИМЕЧАНИЕ Формат, в котором указывается часовой пояс, отличается в разных версиях UNIX. Обратитесь к документации по вашей системе.

Переменные С shell

С shell ведет свою историю с 70-х годов, когда он был разработан в Калифорнийском университете в качестве более совершенного интерпретатора командной строки, чем Bourne shell. Он называется С shell в силу своего сходства с языком программирования С.

Приводимый список не является полным, но содержит наиболее важные и часто используемые переменные. За дополнительной информацией вы можете обратиться к документации по вашей операционной системе. Переменная Значение

cdpath Эта переменная содержит список каталогов, в которых интерпретатор будет искать подкаталог при смене текущего каталога. Например, если ваш файл -cshrc содержит строку cdpath=/usr/users/kevin/data, то для перехода в подкаталог каталога /usr/users/ kevin/data вам не нужно будет указывать полный путь к нему. Эта переменная может содержать список из нескольких каталогов, которые в таком случае должны быть отделены друг от друга двоеточием

echo Если эта переменная установлена, команды будут выводиться полностью, с выполненной подстановкой

history Эта переменная определяет размер списка, в котором хранится история командной строки. История хранит отданные вами команды;

в любой момент вы можете сослаться на одну из предыдущих команд по ее номеру


HOME Когда вы входите в систему, вашим текущим каталогом немедленно становится ваш домашний каталог, полное имя которого хранится в данной переменной. Вы можете в любой момент вернуться в домашний каталог, использовав команду cd без параметров

mail В этой переменной хранится полное имя вашего почтового ящика, в который mailx или другая почтовая программа, которую вы используете, будет переправлять всю приходящую почту

notify Если эта переменная установлена, вы будете получать уведомления о завершении работы фоновых процессов

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

prompt Эта переменная содержит приглашение командной строки. По умолчанию используется символ %

savehist Эта переменная определяет, сколько команд будет сохраняться в файле .history

shell Эта переменная устанавливает дополнительный интерпретатор командной строки, который будет использоваться такими программами, как vi или ed

TERM Эта переменная содержит тип терминала. Например, TERM=VT100 соответствует распространенному типу терминала VT100

USER Эта переменная содержит системный идентификатор пользователя


Сценарии

Обычно вы вводите команды после приглашения командной строки ($ или %). Вы можете ввести как любую из команд, описанных в 5 и б главах книги, так и команды, встроенные в интерпретатор командной строки. Встроенные команды не существуют вне данного интерпретатора командной строки. К таким командам относится, например, команда alias С shell, описанная ниже в разделе <Команды С shell>.

Помимо непосредственного ввода команд в командной строке, вы можете использовать так называемые сценарии, которые представляют собой набор команд, записанный в текстовый файл. Сценарии- удобный способ для выполнения часто используемых последовательностей команд. В DOS роль сценариев играют файлы с расширением ВАТ. В UNIX вы можете называть сценарии так, как вам нравится.

В сценариях вы можете использовать те же команды, которые вы вводите в командной строке, а также несколько более сложных команд, описанных ниже. Обычно намного проще написать сценарий и использовать его при необходимости, чем многократно повторять ввод одной и той же последовательности команд.

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

Подготовка сценария к запуску

Сценарий представляет собой текстовый файл, поэтому, прежде чем вы сможете его запустить, вы должны сообщить системе о том, что этот файл содержит команды. Для этого вы можете использовать команду chmod (описание которой можно найти в главе 5):


$ chmod +x my_shell_script

Эта команда разрешает исполнение файла my_shell_script.

Теперь сценарий готов к запуску, и вы можете испытать его, просто введя имя сценария в командной строке. Например:

$ my_shell_script

Комментарии

Будет весьма разумно записать, что делает созданный сценарий, чтобы через несколько месяцев вы могли вспомнить, зачем же он был нужен. Для этого очень полезны комментарии, которые могут быть включены в сценарий. Комментарий начинается с символа #. Все остальные символы после него до конца строки игнорируются интерпретатором командной строки, и вы можете написать там свои примечания. Например:

# Это комментарий

Комментарии могут быть использованы при работе как с Bourne shell или Korn shell, так и с С shell.

Команды Bourne shell и Korn shell

Когда вы пишете сценарий, вы зачастую сталкиваетесь с необходимостью проверки различных условий и организации ветвлений. Например, давайте представим, что ваш сценарий должен копировать определенный файл (скажем, отчет) в другой каталог. Но если в момент выполнения сценария отчет не существует, копирование производить не нужно. Возможно, вы захотите в таком случае вывести предупреждение. Для вывода строки на экран вы можете воспользоваться командой echo. Но если вы не хотите, чтобы в любом случае производилось копирование файла и вывод сообщения об ошибке, вы должны позаботиться об организации ветвления. В этом вам поможет команда if-then.


if-then

Интерпретаторы командной строки Bourne shell и Korn shell позволяют вам выполнить команду (или последовательность команд) при соблюдении определенного условия и пропустить эту команду (или последовательность команд), если условие не соблюдается. Для этого используется команда if-then, имеющая следующий синтаксис:

if test выражение then

команда! команда2

кoмaндaN fi

Команда if-then использует встроенную команду test (описанную ниже), чтобы определить, выполнять ли заданную последовательность команд. Эти команды должны находиться между then и fi. Длина последовательности команд может быть любой. Ниже приведен пример использования if-then:

# Проверим, равно ли пять пяти. If test 5=5 then

echo "5 равно 5"

fi

Этот пример проверяет, равно ли число пять самому себе. Если равно, то сообщение об этом выводится на экран при помощи команды echo.

Команда test

Команда test является как встроенной командой интерпретатора командной строки, так и командой UNIX. test возвращает значение <истина> тогда и только тогда, когда проверяемое условие выполнено. В противном случае test возвращает значение


<ложь>. Встроенная команда интерпретатора командной строки if использует команду test для определения, выполнять ли последовательность команд между then и fi.

Команда test имеет множество параметров, обсуждение которых выходит за рамки данной книги. Отметим только, что вместо команды test вы можете использовать квадратные скобки. Например:

if [ 5 = 5 ]

then

echo "5 все еще равно 5" fi

За более подробным описанием команды test обратитесь к документации по вашей системе.

if-then-else

Иногда вам может потребоваться выполнить одну из двух последовательностей команд, в зависимости от того, соблюдается или нет какое-либо условие. В таком случае вы можете воспользоваться командой if-then-else, которая имеет следующий синтаксис:

if test выражение then

команда! команда2

командам else

команда Т команда2'

командам' fi

Если условие соблюдается (команда test возвращает значение <истина>), то будет выполнена последовательность команд меж-


ду then и else, в противном случае будет выполнена последовательность команд между else и fi. Например:

if test 4=5 then

echo "4 равно 5" else

echo "4 не равно 5" fi

Когда вы запустите этот сценарий, вы должны убедиться, что 4 не равно 5.

Цикл for

Команда for позволяет написать сценарий, который перебирает некоторое множество значений, выполняя для каждого из них заданную последовательность действий. Чаще всего в сценарии перебираются имена файлов, и с ними выполняются какие-либо действия. Команда for присваивает какой-либо переменной значения из заданного множества и для каждого из них выполняет тело цикла. Используется следующий синтаксис:

for переменная in множество ^значений do

команда! команда2

кoмaндaN done

Часто бывает важно поместить in на отдельную строку.

Все команды между do и done будут выполнены для каждого значения переменной. Например:

for filename

in *.1997

do

echo $filename done


Переменная filename будет по очереди принимать в качестве значения имена файлов, содержащиеся в текущем каталоге и оканчивающиеся на .1997, такие как jan.1997, frb.1997, dec.1997.

Каждое из этих имен при помощи команды echo в теле цикла будет выведено на экран.

Команды С shell

С shell, подобно Bourne shell и Korn shell, имеет свой набор встроенных команд, таких как if-then-else, похожих на соответствующие команды Bourne и Korn shell. Однако, С shell использует свой собственный синтаксис.

if-then

Аналогично интерпретаторам командной строки Bourne shell и Korn shell, С shell имеет команду if-then. Однако синтаксис ее слегка отличается:

if (выражение) then команда! команда2

^coмaндaN endif Ниже приведен пример использования if-then:

# Проверим, равно ли пять пяти. If (5 == 5) then

echo "5 равно 5" endif

Обратите внимание на двойной знак равенства при проверке условия. Кроме того, при использовании С shell then должно находиться на той же строке, что и if.


if-then-else

Вы также можете использовать команду if-then-else, которая имеет следующий синтаксис:

if (выражение) then команда1 команда2

командам else

команда V команда2'

командам' endif

Например:

if test (4 == 5) then

echo "4 равно 5" else

echo "4 не равно 5" endif

Когда вы запустите этот сценарий, он выведет на экран строку <4 не равно 5>.

Цикл foreach

Вместо команды for в С shell применяется команда foreach, тем

не менее, работающая практически так же, как и for. Используется следующий синтаксис:

foreach переменная (множество_значений) команда1 команда2


кoмaндaN end

Например:

foreach filename (*.1997)

echo $filename end

Переменная filename будет по очереди принимать в качестве значения имена файлов, содержащиеся в текущем каталоге и оканчивающиеся на .1997, такие, как jan.1997, frb.1997, dec.1997. Каждое из этих имен при помощи команды echo в теле цикла будет выведено на экран.

Использование команды alias

Помимо перечисленных выше команд, С shell имеет удобную команду alias со следующим синтаксисом:

alias новое_имя старое_имя

Например, если вы увереннее чувствуете себя с DOS, чем с UNIX, вы можете неуютно чувствовать себя при использовании команды Is и ее многочисленных параметров. В таком случае вы можете при помощи команды alias создать для себя аналог команды DOS dir:

alias dir Is -alx

Теперь вы сможете использовать dir вместо более сложной и трудно запоминаемой команды Is -alx, которая является наиболее близким аналогом команды DIR операционной системы DOS.

При помощи alias вы можете расширить набор команд, предлагаемый UNIX. Это очень удобно, особенно если вы недавно работаете с UNIX и привыкли к другой операционной системе.