Командный интерпретатор C-shell
ВведениеКомандный интерпретатор в среде UNIX выполняет две основные функции:
В последнем случае, операционная система позволяет рассматривать командные файлы как разновидность исполняемых файлов. Соответственно различают два режима работы интерпретатора: интерактивный и командный. В среде UNIX (в отличие, скажем, от DOS) имеются несколько различных командных интерпретаторов. Перечислим наиболее популярные:
Операционная система ConvexOS является разновидностью 4.3 BSD UNIX( )BSD - Berkeley Series Distribution и, следовательно, базовой командной оболочкой является csh.
1. Основные возможностиРабота с командной строкойНабираемую пользователем строку интерпретатор воспринимает как команду (или несколько команд). Синтаксис командного интерпретатора позволяет набиратьнесколько команд в одной строке, разделяя их точкой с запятой. Например % cd /tmp; lf эквивалентно двум последовательно введенным командам: % cd /tmp % lf Наоборот, при желании пользователь может продолжить набор длинной команды на следующей строке, закончив текущую строку знаком \\. До завершения ввода команды вы будете получать ``вторичное приглашение'' > вместо основного (%). Например, % tar tv Makefile star.o star.c star.dat main.o main.c эквивалентно % tar tv Makefile star.o \ > star.c star.dat \ > main.o main.c
Управление потоками ввода-вывода осуществляется, подобно DOS(Точнее, синтаксис перенаправления потоков ОС DOS восприняла от UNIX) с помощью символов > , > > , < , < < , |. Отметим здесь только следующее: в отличие от DOS при создании программного канала между двумя процессами ОС UNIX запускает оба процесса одновременно и осуществляет передачу информации через системный буфер (без промежуточной записи на жесткий диск). Таким образом, программные каналы в ОС UNIX являются весьма эффективным способом обмена. В случае переполнения системного буфера (например если ``передающая'' программа выдает информацию в канал быстрее чем ее может обработать ``принимающая'' программа) ОС автоматически приостанавливает тот процесс, который осуществляет запись в канал до освобождения буфера. Полезный частный случай использования механизма перенаправления потоков - перенаправление в /dev/null, что позволяет избавиться от ненужных сообщений на экран. С помощью того же механизма можно создавать пустые файлы: % cat < /dev/null > myfile создаст в текущей директории пустой файл myfile. Дополнительно C-shell позволяет группировать команды с помощью круглых скобок. В этом случае вся конструкция внутри скобок рассматривается интерпретатором как одна команда. Сие полезно, например, в таких конструкциях: % (command1 | command2) < myfile Если же скобки опустить, shell не сможет определить какой из команд вы хотите подать на вход файл myfile. Следующие ``удобства'' существуют в данной реализации C-shell:
Разбор командной строкиИнтерпретатор, получив командную строку, выполняет над ней ряд преобразований, а именно:
Разберем эти действия по этапам. Псевдонимы (alias). Встроенная команда alias позволяет определять псевдонимы команд. Пример: % alias mycat 'cat | more' определяет mycat как псевдоним строки cat | more. Поэтому далее вы вправе пользоваться командой mycat, которая будет раскрыта интерпретатором везде, где вы ее используйте. Это - способ определения коротких имен для длинных составных команд. Встроенная команда unalias mycat уничтожает ранее введенный псевдоним mycat. Метасимволы. Метасимволы позволяют кратко записывать целые списки слов (главным образом - имен файлов). Shell рассматривает слово, в котором встречаются метасимволы, как шаблон для составления списка имен файлов:
Наконец, тильда позволяет указать домашний каталог пользователя:
Переменные shell. Слова, начинающиеся с символа $ командный интерпретатор воспринимает как имена переменных. Переменные делятся на переменные окружения (они будут известны всем вызванным из этой shell программам и являются в этом смысле глобальными) и простые переменные. Встроенная команда set name=value позволяет определить простую переменную с именем name и дать ей значение value. Встретив в командной строке выражение $name интерпретатор заменит его на value. Например,
% set color=blue % echo $colorвыдаст на терминал строчку blue. А % set color=blue % echo new$colorдаст newblue. Наконец, введя % set color=blue % echo ${color}newполучим colornew. Последний пример демонстрирует как надо использовать фигурные скобки для выделения имени переменной из слова (на echo $colornew интерпретатор бы ответил, что переменная colornew не определена. Команда unset уничтожает ранее определенные переменные. Чтобы определить переменную равной строке из нескольких слов, заключите ее в простые кавычки. Пример % set color='blue or red or green' Простые переменные могут быть массивами слов (что надо отличать от только что рассмотренного случая, когда переменная содержит строку из нескольких слов. Для объявления массива надо использовать круглые скобки: % set colors=(blue red green)Теперь команда echo $colors выдаст строку из трех цветов (попробуйте!). Однако вы можете также работать в отдельными элементами массива (элементы нумеруются с нулевого значения), например так: % echo $colors[2](получим green). Количество элементов в массиве содержится в переменной $#colors. % echo $#colorsдаст на терминал цифру 3. Возможны довольно сложные комбинации с использованием шаблонов, например: % set files=(m*) % echo $#filesвыдаст число файлов в текущем каталоге, начинающихся с буквы m. Переменные окружения вызываются точно также как и простые переменные. Разница заключается в способе их определения: Команда % setenv name value устанавливает переменную окружения с именем name. Обратите внимание на раздражающую разницу в синтаксисе: определяя переменную окружения не надо ставить знак =. Список всех переменных окружения можно получить с помощью встроенной команды printenv. Отменить определения переменной окружения можно с помощью unsetenv. Наконец, для определения массива переменных окружения НЕ используются круглые скобки, а используются двоеточия в качестве разделителей элементов массива: % setenv MANPATH /usr/man/:/usr/local/man:/usr/man/X11:~/man
Встроенные команды и переменныеСписок важнейших встроенных команд C-shell с краткими пояснениями:
Список важнейших встроенных переменных C-shell с краткими пояснениями:
Управляющие операторы и операторы циклаИз списка встроенных команд оболочки мы сознательно исключили условные операторы и операторы цикла, которые будут рассмотрены здесь.
Условное выполнениеСинтаксис условного оператора if в C-shell таковif (expr ) command if (expr ) then ... else ... endif В качестве expr может стоять либо арифметическое выражение, либо проверка атрибутов файла. Пример: if ( $i< 10 ) echo $iили if ( -f /etc/hosts ) cat /etc/hostsРассмотрим последний случай подробнее. Возможны следующие проверки атрибутов файла: -r доступен на чтение -w доступен на запись -x доступен на исполнение -e проверка существования файла -o проверка что вы являетесь хозяином данного файла -z файл имеет нулевой размер -f файл является обычным файлом -p файл является именованным программным каналом -d файл является директорией
Цикл whilewhile ( expr ) ... end Цикл выполняется до тех пор, пока условие истинно. Пример: while ( $#files > 0 ) echo $files[0] shift files end Цикл foreachЭто чрезвычайно полезный оператор, позволяющий организовать цикл по элементам массива словforeach varname ( list ) ... end Тело цикла выполняется столько раз, сколько элементов в массиве list. При этом переменная varname содержит очередное значение элемента массива. Пример foreach color ( blue red green ) echo The color is $color endБолее содержательный пример: переименовывает все файлы в текущей директории с суффиксом .for в файлы с суффиксом .f. foreach file ( *.for ) echo Renaming $file mv $file `basename $file .for`.f endЗдесь использована стандартная команда basename, которая ``отрезает'' у слова, заданного в первом аргументе суффикс, заданный вторым аргументом и выводит получившееся слово на стандартный вывод. Об использовании обратных кавычек в языке C-shell будет рассказано несколько позже.
Многовариантный условный операторСинтаксис условного оператора switch в C-shell таковswitch (string ) case pattern1 : ... breaksw case {\it pattern2} : ... breaksw ... default: ... endsw Оператор позволяет передавать управление в зависимости от того, удовлетворяет ли строка string какому-либо шаблону из набора pattern1, pattern2, ...( в этом случае управление передается в блок, ограниченный case ... breaksw) или нет (в этом случае управление передается на ветвь default:... endsw. В целом, оператор switch очень похож на аналогичный опреатор языка C. Такие конструкции часто используются в командных файлах для анализа ответа пользователя на заданный вопрос ([Yes/No]).
|
<<< | Оглавление | Страницы: 1 2 | >>> |