НАЗВАНИЕ
csh - Активизирует командный интерпретатор shell с синтаксисом, аналогичным синтаксису языка С.
СИНТАКСИС
csh [ -cefinstvVxX ] [ arg ... ]
ОПИСАНИЕ
Команда csh является интерпретатором языка команд. Она начинается с выполнения команд из файла .cshrc во входном (home) каталоге вызвавшего ее пользователя. Если это интерпретатор
shell вхождения в систему, то, кроме того, он выполняет здесь
команды из файла .login. В случае нормального функционирования, интерпретатор shell начинает cчитывание команд с терминала, выводя в качестве приглашения знак %. Процесс обработки
аргументов и использование интерпретатора shell для обработки
файлов, содержащих командные сценарии, будут описаны позже.
Затем интерпретатор shell неоднократно выполняет следующие действия: считывается строка командного ввода и заносится в words (слова). Полученная из слов последовательность помещается в список предыстории команд, а затем подвергается синтаксическому анализу. После этого, наконец, каждая команда текущей строки выполняется.
Когда завершает свое выполнение интерпретатор shell вхождения в систему, он выполняет команды из файла .logout во входном (home) каталоге пользователя.
Лексическая структура
Интерпретатор shell разделяет входные строки на слова, считая,
что они отделяются друг от друга пробелам и знакам табуляции,
и учитывая следующие исключения. Символы &, |, ;, <, >, (, )
формируют отдельные слова. Отдельные слова формируют такие пары сдвоенных символов, как &&, ||, << или >>. Эти метасимволы
синтаксического анализатора могут быть частью других слов;или
их специальное назначение может быть отменено предшествующим
им символом \. Признак новой строки, с предшествующим ему символом \, эквивалентен пробелу.
Кроме того, строки, заключенные в пары соответствующих кавычек: `, ' или ", формируют части слова; метасимволы в таких строках, включающих пробелы и знаки табуляции, не формируют отдельных слов. Семантика таких кавычек впоследствии описывается. Внутри пар, состоящих из символов \ или ", признак новой строки с предшествующим знаком \ представляет собой действительно символ новой строки.
Когда входные данные для интерпретатора shell вводятся не с терминала, символ # указывает, что в строке находятся комментарии, которые продолжаются до конца входной строки. Этот символ не имеет этого специального значения, если ему предшествует знак \, и если он находится внутри кавычек `, ' или ".
Команды
Простая команда представляет собой последовательность из слов,
первое из которых определяет команду, которая должна быть выполнена. Простая команда или последовательность из простых команд, разделенных символом |, формирует конвейер. Выход каждой
команды в конвейере связывается со входом следующей команды.
Последовательности конвейеров могут быть разделены точкой с
запятой, и затем выполняются последовательно. Последовательность конвейеров может быть выполнена, не дожидаясь завершения
выполнения последовательности, если за ней следует знак &. Завершение такой последовательности по сигналу разъединения автоматически запрещается; использование команды nohup не требуется.
Любые последовательности из описанных выше могут быть заключены в круглые скобки для того, чтобы сформировать простую команду (которая, в свою очередь, может быть составляющей некоторого конвейера, и т.д.). Кроме того, как и в языке С, можно разделять конвейеры, указав знаки && или ||, которые означают, что второй конвейер будет выполняться только в случае успешного или неуспешного завершения первого, соответственно. (См. раздел "Выражения".)
Подстановки
Следующие разделы описывают различные преобразования входных
данных, выполняемые интерпретатором shell, в том порядке, в
каком они встречаются.
Подстановки Предыстории
Подстановки предыстории могут быть использованы для повторного
ввода последовательностей слов из предыдущих команд, возможно,
модифицированных. Таким образом, подстановки предыстории обеспечивают обобщение функции redo.
Подстановки предыстории начинаются с символа ! и могут начаться в любом месте входного потока, если они уже не выполняются. Символу ! может предшествовать символ \ для отмены его специального назначения; символ ! проходит неизмененным, если за ним следует пробел, знак табуляции, признак новой строки, знак = или знак (. Также, подстановки предыстории могут встречаться, когда входная строка начинается со знака ^. Эта специальная аббревиатура будет описана позже.
Любая входная строка, содержащая подстановку предыстории, отображается перед ее выполнением на терминале так, как если бы она была введена без подстановки предыстории.
Команды, вводимые с терминала, которые состоят из одного или более слов, сохраняются в списке предыстории, размером которого управляет значение переменной history. Предыдущая команда сохраняется всегда. Нумерация команд производится последовательно от 1.
Например, введите команду:
history
Теперь просмотрите следующий вывод, производимый командой history:
9 write michael 10 ex write.c 11 cat oldwrite.c 12 diff *write.c
Показаны команды с их пособытийными номерами. Обычно, использование пособытийных номеров не является обязательным, но текущий событийный номер может быть сделан частью приглашения, выводимого на экран, при введении в эту строку приглашения знака !.
Если текущим событием является событие с номером 13, то мы можем сослаться на предыдущие события при помощи событийного номера следующим образом: !11, или же при помощи записи !-2 (относящейся к тому же событию), а также с использованием префикса (первой буквы) командного слова: !d для события 12 или префикса !w для события 9, или при помощи строки символов, содержащихся в слове из команды, как например, строка !?mic? тоже отсылает к событию 9. Такие формы вводимых записей, без последующей модификации, просто осуществляют повторный ввод слов определенных событий, отделяемых друг от друга одним пробелом. Отдельным случаем является запись вида !!, которая осуществляет ссылку на предыдущую команду; таким образом, запись !! является по существу функцией redo. Запись вида !# производит ссылку на текущую (вводимую в данный момент) команду. Например, как в записи !#:1, эта ссылка позволяет выбрать слово из находящегося слева текста текущей строки, что предотвращает повторный ввод длинного имени.
Чтобы выделить слова из некоторого события, следует ввести спецификацию события, затем двоеточие и указатель на желаемые слова. Слова во входной строке нумеруются от 0, первое слово (обычно, команда) имеет номер 0, второе слово (первый аргумент) имеет номер 1, и т.д. Основными указателями на слова являются следующие значения:
0 | Первое слово (команда) |
---|---|
n | n - аргумент |
^ | Первый аргумент, т.е. 1 |
$ | Последний аргумент |
% | Слово, соответствующее строке поиска ?s? (непосредственно предшествующей в записи спецификации события) |
x-y | Диапазон слов |
-y | Аббревиатура для записи диапазона 0-y |
* | Аббревиатура для записи диапазона ^-$, которая задает пустое множество, если в событии только 1 слово. |
x* | Аббревиатура для записи диапазона x-$ |
x- | Аналогично x*, но не включая слово $. |
Двоеточие, отделяющее спецификацию события от указателя на слова, может быть опущено в случае, если аргументный селектор начинается с символа ^, $, *, - или %. После указателя на слова, который может и отсутствовать, может быть помещена последовательность модификаторов так, что каждому предшествует двоеточие. Определяются следующие модификаторы:
h | Удаляет последнюю составляющую обозначения пути |
---|---|
r | Удаляет последнюю составляющую .XXX |
s/l/r | Производит подстановку l вместо r |
t | Удаляет все предшествующие составляющие обозначения пути |
& | Повторяет предыдущую подстановку |
g | Выполняет глобальную замену, с учетом указанных ранее подстановок |
p | Печатает новую команду, но не выполняет ее |
q | Заключает в кавычки подставленные слова, предотвращая выполнение подстановок |
x | Аналогично q, но прерывает слова на пробелах, знаках табуляции и признаках новой строки. |
Если не предшествует модификатор g, то модификация применяется только к первому доступному для изменения слову. В случае любой модификации ошибочной ситуацией является отсутствие соответствующего слова.
Левые части подстановок являются не регулярными, в смысле редакторов, выражениями, а скорее строками. Любой символ может быть использован в качестве разделителя вместо знака /; знак \ заключает в кавычки разделитель внутри строк l и r. Символ & в правой части подстановки заменяется на текст из левой части. Знак \ также заключает в кавычки символ &. Пустое значение строки l использует предыдущую строку, взятую из предыдущего значения l, или из контекстуально сканированной строки s в подстановке !?s?. Последний разделитель в подстановке может быть опущен, если в контекстуальном сканировании за последним знаком вопроса ? сразу же следует признак новой строки.
Ссылка предыстории может быть задана без спецификации события, например, !$. В этом случае ссылка относится либо к предыдущей команде, если в той же самой строке отсутствует предыдущая ссылка предыстории, либо, в противном случае, эта форма подстановки повторяет предыдущую ссылку. Таким образом запись вида !?foo?^!$ задает первый и последний аргумент из команды, соответствующей подстановке ?foo?.
Существует специальная аббревиатура ссылки предыстории, представляемая знаком ^, который является первым непустым символом входной строки. Она эквивалентна подстановке вида !:s^ и обеспечивает удобное сокращение для замещений на текст из предыдущей строки. Таким образом, запись ^lb^lib проверяет орфографию lib в предыдущей команде. Наконец, подстановка предыстории может быть заключена в фигурные скобки { и }, если необходимо изолировать ее от последующих символов. Таким образом, после команды ls -ld ~paul Вы можете сделать подстановку !{l}a, чтобы в результате выполнить команду ls -ld ~paula, в то время как запись вида !la будет просматривать команды, начинающиеся с la.
Заключение В Кавычки При Помощи Знаков ' и "
Заключение в кавычки строк при помощи знаков ' и " может быть
использовано для предупреждения всех или некоторых из оставшихся подстановок. Строки, заключенные в кавычки вида ', предупреждают любую последующую интерпретацию. Строки, заключенные в кавычки вида ",являются доступными и может быть произведено их командное раскрытие.
В обоих случаях результирующий текст становится (весь или его часть) отдельным словом; только в одном специальном случае (см. раздел Подстановка Команд) заключенная в кавычки вида " строка производит части более чем одного слова; строка, заключенная в кавычки вида ', этого не делает.
Подстановка Псевдонимов
Интерпретатор shell поддерживает перечень псевдонимов, которые
могут быть установлены, выведены на экран и модифицированы при
помощи команд alias и unaliase. По завершению сканирования командной строки, она подвергается синтаксическому анализу, в
результате чего разбивается на отдельные команды, и после этого проверяется первое слово каждой команды, слева направо,
имеет ли оно псевдоним. Если имеет, то текст, который является псевдонимом для этой команды, при помощи механизма предыстории считывается повторно таким образом, как если бы эта команда была предыдущей входной строкой. Полученные в результате слова заменяют эту команду и список аргументов. Если не было сделано ни одной ссылки к списку предыстории, то список аргументов остается без изменений.
Таким образом, если псевдонимом для команды ls является ls -l, то команда "ls /usr" будет преобразована в команду "ls -l /usr". Аналогично, если псевдоним для команды lookup был "grep \!^ /etc /passwd", то команда "lookup bill" будет преобразована к виду "grep bill /etc/passwd".
Если псевдоним найден, то выполняется пословная трансформация входного текста, и процесс выявления псевдонимов начинается сначала уже над переформатированной входной строкой. Если первое слово нового текста является таким же, что и в старом тексте, то во избежание зацикливания это слово отмечается флагом, чтобы препятствовать следующей подстановке псевдонима. Прочие циклы обнаруживаются и приводят к ошибочной ситуации.
Отметим, что такой механизм допускает псевдонимы для представления метасинтаксиса синтаксического анализатора. Таким образом, мы можем назначить псевдоним печати "'pr\!* | lpr'", чтобы сформировать команду, которая разбивает на страницы свои аргументы для построчного принтера.
Существует четыре псевдонима команды csh, поставляемые с командой csh системы XENIX System V. Это pushd, popd, swapd и flipd. Эти псевдонимы поддерживают стек каталогов.
Подстановка Переменных
Интерпретатор shell поддерживает набор переменных, каждая из
которых имеет в качестве ее значений список из нуля или более
слов. Некоторые из этих переменных устанавливаются интерпретатором shell или на них можно ссылаться при помощи интерпретатора shell. Например, переменная argv является отображением
списка аргументов интерпретатора shell, и на слова, указанные
в значении этой переменной, можно ссылаться только специальными способами.
Значения переменных могут быть выведены на экран и изменены при помощи команд set и unset. Некоторое число переменных, на которые производятся ссылки при помощи интерпретатора shell, являются двоичными переключателями; интерпретатор shell не проверяет, какие значения имеют эти переменные, а только установлены они или нет. Например, переменная verbose является двоичным переключателем, который назначает вывод на экран отображения вводимой команды. Эта переменная устанавливается в результате применения в командной строке опции -v.
Некоторые другие операции трактуют переменные в числовом значении. Команда со знаком @ допускает выполнение числовых вычислений и назначение результата переменным. С другой стороны, значения переменных всегда представляются в виде (нуля или более) символьных строк. В целях проведения числовых операций нулевая символьная строка рассматривается, как ноль, а второе и последующие слова значения переменной, состоящего из нескольких слов, игнорируются.
После того, как для входной строки выявлены псевдонимы, и проведен синтаксический анализ, и перед тем, как каждая команда будет выполнена, выполняется подстановка переменных, подключаемая при помощи символов знака доллара ($). Такое раскрытие может быть отменено указанием обратной косой черты (\) перед знаком доллара, но не в двойных кавычках ("), где оно всегда появляется, и не в одинарных кавычках ('), где оно никогда не появляется. Строки, заключенные в обратные кавычки (`), интерпретируются позже (См. раздел Подстановка Команд ниже), так что подстановка знака доллара не возникает в таких строках до последнего момента, если вообще возникает. Знак доллар проходит без изменений, если за ним следуют пробел, знак табуляции или признак новой строки.
Переадресации ввода и вывода распознаются перед раскрытием переменных, и представляют собой переменные, раскрываемые особо. С другой стороны, имя команды и полный список аргументов раскрываются вместе. Таким образом, для первого слова (команды) возможна генерация более, чем одного слова, первое из которых становиться именем команды, а остальные - аргументами.
Если отсутствует заключение в двойные кавычки или не задан модификатор :q, результатами подстановки переменной могут в конечном счете оказаться подставленные команда и имя файла. Заключенная в двойные кавычки (") переменная, значение которой состоит из нескольких слов, раскрывается в часть одного слова со словами, указанными в значении переменной и разделенными пробелами. Когда для подстановки употребляется модификатор :q, переменная раскрывается в несколько слов, где каждое отделено пробелом и заключено в кавычки, чтобы воспрепятствовать дальнейшей подстановке команды или имени файла.
Ниже приведены последовательности для введения значений переменных на вход интерпретатора shell. Кроме выше указанного, ссылка на неустановленную переменную считается ошибкой.
Если параметр name не является переменной интерпретатора shell, но устанавливается в среде, то возвращается именно это значение (но : модификаторы и другие формы записей, заданные ниже, в этом случае становятся недоступными).
Модификаторы :h, :t, :r, :g и :x могут быть применены к подстановкам, описанным выше, как и модификаторы :gh, :gt и :gr. Если в командной форме появляется пара скобок { }, то модификаторы должны быть внутри этих скобок. В каждом раскрытии $ допускается только один модификатор :.
При помощи модификаторов : не могут быть модифицированы следующие подстановки:
Подстановка Команд и Имен Файлов
Подстановка команд и имен файлов применяется выборочно к аргументам встроенных команд. Это означает, что части выражений,
которые не являются оцениваемыми, не подвергаются этим раскрытиям. Для команд, которые не являются внутренними по отношению
к интерпретатору shell, имя команды подлежит подстановке отдельно от списка аргументов. Это происходит много позже, после
выполнения переадресации ввода-вывода, и в процессе, порожденном главным процессом интерпретатора shell.
Подстановка Команд
Подстановка команд указывается включением команды в обратные
кавычки. Вывод, производимый такой командой, как правило, помещается в отдельные слова, разделенные пробелами, знаками табуляции и признаками новой строки, где нулевые слова отбрасываются, после чего этот текст помещается в оригинальную строку. Внутри двойных кавычек только признаки новой строки приводят к образованию новых слов; пробелы и знаки табуляции сохраняются.
В любом случае, находящийся в конце единственный признак новой строки не образует нового слова. Заметим, существует вероятность того, что в результате подстановки команды будет произведена только часть слова, даже если выходные данные команды составляют полную строку.
Подстановка Имен Файлов
Если некоторое слово содержит любой из символов: *, ?, [ или
{, или начинается с символа ~, то это слово является кандидатом на выполнение подстановки имен файлов, также известной,
как глобальная подстановка. Это слово, затем, принимается за
образец и заменяется на перечень имен файлов, отсортированных
в алфавитном порядке, которые соответствуют этому образцу. В
некотором списке слов, задающем подстановку имен файлов, ошибкой является отсутствие образца для сопоставления с существующим именем файла, но при этом не требуется, чтобы каждый образец сопоставлялся. Только метасимволы *, ? и [ подразумевают
сопоставление образцу, символы ~ и { скорее сродни аббревиатурам.
В именах файлов, сопоставляемых с образцом, символ . либо в начале имени файла, либо следующий непосредственно за символом /, так же как и сам символ /, должны быть в точности совпадающими. Символ * соответствует любой символьной строке, включая пустую. Символ ? соответствует одному любому символу. Последовательность в квадратных скобках [] задает соответствие одному (любому) из символов, заключенных в скобки. Пара символов, разделенных знаком -, и заключенная в квадратные скобки [], задает соответствие любому символу, лексически расположенному между этой парой символов.
Символ ~ в начале имени файла используется для ссылки на собственные (home) каталоги. Будучи единственным, он раскрывается, как входной (home) каталог вызывающего пользователя, отображенный в значении переменной home. Когда за этим символом следует имя, содержащее буквы, цифры и символы -, интерпретатор shell осуществляет поиск пользователя с таким именем и подставляет его входной (home) каталог. Так, запись ~ken может быть раскрыта как /usr/ken, а запись ~ken/chmach - в виде /usr/ken/chmach. Если за символом ~ следует символ, отличный от буквы или символа /, или символ ~ появляется не в начале слова, то он остается без изменений.
Метаназначение a{b,c,d}e является сокращением для abe ace ade. Порядок следования слева направо сохраняется, при этом результаты сопоставления сортируются отдельно, начиная с нижнего уровня, чтобы сохранить этот порядок. Эта конструкция может быть вложенной. Так, запись вида ~source/sl/{oldls,ls}.c в предположении, что собственным каталогом для sourse является / usr/source, раскрывается в следующие имена файлов: /usr/source /sl/oldls.c и /usr/source/sl/ls.c, независимо от того, существуют или нет эти файлы. Аналогично, форма вида ../{memo,*box} может быть раскрыта как ../memo ../box ../mbox. (Заметим, что имя memo не будет упорядочено наряду с результатами сопоставления по образцу *box.) В виде исключения символы {, } и {} проходят без изменений.
Средство Контроля Орфографии
Также, как и в интерпретаторе shell Баурна, при использовании
команды cd(C) данный интерпретатор shell осуществляет проверку
орфографии. Например, если Вы производите смену каталога при
помощи команды cd и сделали орфографическую ошибку в имени каталога, интерпретатором shell будет предложен альтернативный
вариант орфографии для существующего каталога. Введите "y"
(да) и нажмите клавишу RETURN (или сразу же нажмите RETURN),
чтобы произвести изменение на представленный каталог. Если
предложенная орфография некорректна, введите "n" (нет), затем
снова наберите командную строку. В приведенном примере ответ
команды csh(C) выделен жирным шрифтом:
% cd /usr/spool/uucp 2/usr/spool/uucp?0y 2ok
Ввод/Вывод
Стандартный ввод и стандартный вывод могут быть переадресованы
с использованием следующего синтаксиса:
Если установлена переменная noclobber (не разрушать), то этот файл либо не должен до этого существовать, либо он должен быть специальным символьным файлом (например, терминалом или /dev/null), в противном случае результатом будет ошибка. Это помогать предотвратить случайное разрушение файлов. В таком случае, для подавления этой проверки могут быть использованы записи, включающие знак !.
Формы записей, включающие знак &, направляют диагностический вывод в определенный файл, так же как и стандартный вывод. Параметр name раскрывается так же, как и в случае записи вида < для имен файлов ввода.
Если выполняется неприсоединенная команда (с последующим знаком &), то стандартным вводом для этой команды по умолчанию будет пустой файл /dev/null. В противном случае, эта команда присутствует в конвейере и воспринимает среду, в которой был вызван интерпретатор shell, как уже измененную при помощи параметров ввода-вывода. Таким образом, как и для некоторых более ранних интерпретаторов shell, команды, выполняемые из файла команд интерпретатора shell, не имеют доступа к тексту команд по умолчанию; вместо этого они принимают первоначальный стандартный ввод интерпретатора shell. Механизм << должен быть использован для представления последовательных данных. Это позволяет командным сценариям интерпретатора shell функционировать в качестве составляющих конвейеров, а также разрешает интерпретатору shell блокировать чтение его ввода.
Диагностический вывод может быть направлен через программный канал со стандартным выводом. Просто следует использовать форму записи |& вместо |.
Выражения
Несколько встроенных команд (должны быть описаны позже) используют выражения, операторы в которых аналогичны применяемым
в языке С, с тем же самым порядком старшинства. Такие выражения появляются в командах @, exit, if и while. Доступными являются следующие операторы:
|| && | ^ & == != <= >= < > << >> + - * / % ! ~ ( )
Здесь порядок старшинства увеличивается слева направо, операторы == и !=, <=, >=, < и >, << и >>, + и -, * / и %, находясь в группах, имеют тот же уровень старшинства. Операторы == и != сравнивают свои аргументы в виде символьных строк, остальные операторы действуют на числах. Символьные строки, начинающиеся с 0, рассматриваются как восьмеричные числа. Нулевые или отсутствующие аргументы рассматриваются как 0. Результатом всех выражений являются строки, которые представляют собой десятичные числа. Важно отметить, что никакие две составляющие выражения не могут появляться в одном слове; исключение представляют смежные составляющие выражений, которые имеют синтаксическое значение для синтаксического анализатора (& | < > ( )), они должны быть окружены с двух сторон пробелами.
Кроме того, в выражениях доступными, как примитивные операнды, являются командные исполнения, заключенные в скобки вида { и }, а также файловые запросы вида -l name, где l имеет одно из значений:
r | Доступ для чтения |
---|---|
w | Доступ для записи |
x | Доступ для выполнения |
e | Существование |
o | Владение |
z | Нулевой размер |
f | Простой файл |
d | Каталог |
Задаваемым значением name в файловых запросах является раскрытие команды и имен файлов, которое, затем, проверяется на соответствие заданных полномочий (-l) правам реального пользователя. Если файл не существует, или не является доступным, то все запросы возвращают значение false(ложь), т.е. 0. Если выход из команды происходит со статусом 0, то командные исполнения завершаются успешно, возвращая значение true (истина), т.е. 1; в противном случае, они завершаются неуспешно, возвращая значение false, т.е. 0. Если требуется получить более детальную информацию о статусе, то команда должна быть выполнена вне выражения и должна быть проконтролирована переменная status.
Управляющая Логика
Интерпретатор shell содержит некоторое число команд, которые
могут быть использованы для регулирования логики управления в
командных файлах (сценариях интерпретатора shell) и при вводе
с терминала (ограниченный, но удобный способ). Под действием
таких команд интерпретатор shell осуществляет повторное считывание или пропуск своих входных данных, а также, в зависимости
от реализации, эти команды ограничивают местоположение некоторых из них.
Утверждения foreach, switch и while, так же как и форма if-then-else утверждения if, требуют, чтобы главные ключевые слова появлялись в одной простой команде на входной строке так, как это показано ниже.
Если ввод интерпретатора shell не доступен для поиска, то интерпретатор shell накапливает входные данные в буфере всякий раз, когда происходит считывание цикла, и выполняет поиск в этом внутреннем буфере для осуществления повторного считывания, предполагаемого этим циклом. (В той степени, насколько это возможно, команды возвратного перехода будут выполнены успешно для входных данных, недоступных для поиска.)
Встроенные Команды
Встроенные команды выполняются внутри интерпретатора shell.
Если встроенная команда встречается как любая составляющая некоторого конвейера, исключая последнюю, то она выполняется в
интерпретаторе sub-shell.
Встроенная команда continue может быть использована для того, чтобы продолжить цикл преждевременно, а встроенная команда break для его преждевременного завершения. При считывании этой команды с терминала считывание цикла происходит один раз с выдачей приглашения в виде знака ? перед выполнением любого утверждения из цикла.
Во всяком случае, если выполняется неприсоединенный интерпретатор shell и игнорируются прерывания, все виды записей onintr не имеют смысла, и интерпретатор shell, также как и все вызванные команды, продолжают игнорировать прерывания.
Эти аргументы могут быть повторены, чтобы установить несколько значений в одной команде установки. Заметим, тем не менее, что раскрытие переменных производится для всех аргументов перед тем, как происходит какая-либо установка.
Операторы *=, +=, и т.п. являются доступными, как и в языке С. Пробел, отделяющий имя от оператора назначения, является необязательным. Наличие пробелов является обязательным в разделяемых составляющих выражения expr, которые в любом случае должны быть отдельными словами.
Специальные постфиксные операторы ++ и --, соответственно, увеличивают на единицу и уменьшают на единицу значение name, например, @ i++.
Предопределенные Переменные
Последующие переменные имеют специальное значение для интерпретатора shell. Из них argv, child, home, path, prompt, shell
и status всегда устанавливаются интерпретатором shell. За исключением child и status, эта установка производится только при
инициализации; эти переменные не будут модифицироваться до тех
пор, пока это определенно не будет сделано пользователем.
Интерпретатор shell копирует переменную среды PATH в переменную path, а также копирует это значение обратно в среду всякий раз, когда переменная path устанавливается. Следовательно, не стоит беспокоиться о том, что ее установка будет отличаться от той, что присутствует в файле .cshrc, так как внутренние процессы csh будут импортировать определение переменной path из среды.
argv | Принимается в качестве аргументов для интерпретатора shell, именно из этой переменной производится подстановка позиционных параметров, например, $1 заменяется на $argv[1], и т.д. |
---|---|
cdpath | Задает список альтернативных каталогов для поиска подкаталогов в командах cd. |
child | Выводится номер процесса, когда последняя команда была разветвлена при помощи &. Эта переменная является командой unset, когда этот процесс завершается. |
echo | Устанавливается, когда в командной строке задана опция -x. Вызывает отображение на экране каждой команды и ее аргументов непосредственно перед тем, как команда выполняется. Для невстроенных команд все раскрытия происходят до их отображения на экране. Встроенные команды отображаются на экране до выполнения подстановки команд и имен файлов, поскольку эти подстановки выполняются затем выборочно. |
histchars | Может быть назначена двух-символьная строка. Первый символ используется в качестве символа предыстории вместо знака !, второй символ используется вместо механизма подстановки ^. Например, если произведена установка вида histchars=",;", то символами предыстории будут точка и точка с запятой. |
history | Может быть задано числовое значение для контролирования размера списка предыстории. Никакая команда, на которую производится ссылка, укладывающаяся в это количество событий, не будет отброшена. Слишком большое значение переменной history может привести к превышению памяти интерпретатора shell. Последняя выполняемая команда всегда сохраняется в списке предыстории. |
home | Входной (home) каталог вызывающего пользователя, эта переменная инициализируется из среды. Раскрытие имени файла, представленного ~, отсылает к этой переменной. |
ignoreeof | Если эта переменная установлена, то интерпретатор shell игнорирует признак конца файла от устройств ввода, которые являются терминалами. Это предотвращает ситуацию случайного завершения интерпретатора shell по нажатию Ctrl-D. |
Файлы, которые интерпретатор shell проверяет
на наличие почтовых сообщений. Эта проверка
выполняется после завершения каждой команды,
результатом которой будет вывод приглашения,
при условии истечения заданного временного интервала. Интерпретатор shell выводит сообщение
"You have new mail" (Для Вас есть новая почта"), если существует файл, для которого время
доступа не превышает времени его модификации.
Если первое слово значения переменной mail является числом, то оно задает иное значение интервала проверки почты, а именно: в секундах, вместо значения по умолчанию, которое составляет 10 минут. Если указаны несколько почтовых файлов, то при наличии почты в файле, определяемом именем name, интерпретатор shell отвечает сообщением "New mail in name" ("Новая почта в файле name"). | |
noclobber | Как было описано в разделе "Ввод/Вывод", на переадресацию вывода накладываются определенные ограничения для того, чтобы предохранить такие файлы от случайного повреждения, а переадресации вида >> относятся к существующим файлам. |
noglob | Установка этой переменной препятствует раскрытию имен файлов. Это очень удобно для сценариев интерпретатора shell, которые не работают с именами файлов, или после того, как получен список имен файлов, а дальнейшие раскрытия являются нежелательными. |
nonomatch | Если эта переменная установлена, то не будет ошибкой ситуация, когда раскрытие имен файлов не соответствует никаким существующим файлам; при этом просто возвращается этот первоначальный образец. Однако, ошибкой будет неправильно сформированный образец, т.е. отображение [ дает ошибку. |
path | Каждое слово переменной пути path задает каталог, в котором должны быть найдены команды для выполнения. Нулевое слово указывает на текущий каталог. Если переменная path отсутствует, то будут работать только полные обозначения путей. Обычно, путь поиска представляется как /bin, /usr/bin и ., но он может изменяться в зависимости от используемой системы. Для привилегированного пользователя путь поиска по умолчанию представляется каталогами /etc, /bin и /usr/bin. Интерпретатор shell, которому не задана ни опция -c, ни опция -t, как правило, будет хэшировать содержимое каталогов в переменной path после считывания файла .cshrc каждый раз, когда переустанавливается переменная path. Если при активизированном интерпретаторе shell в эти каталоги добавляются новые команды, то имеет смысл задавать команду rehash, в противном случае эти команды могут быть не найдены. |
prompt | Символьная строка, которая выводится перед каждой командой, считываемой с терминального ввода в интерактивном режиме. Если в этой строке появляется символ !, то он будет заменен на номер текущего события, если ему не предшествует символ \. Для привилегированного пользователя эта переменная имеет значение % или #. |
shell | Файл, в котором находится интерпретатор shell. Эта переменная используется в разветвляющихся процессах интерпретатора shell для интерпретации файлов, для которых установлены биты исполнения, но которые не доступны для выполнения системой. (См. ниже раздел "Выполнение невстроеннных команд".) При инициализации заносится во входной (home) каталог (системно-зависимый) интерпретатора shell. |
status | Возвращаемый статус (состояние завершения) последней команды. Если она завершилась не нормально, то к значению статуса добавляется 0200. При неуспешном завершении встроенных команд возвращается статус 1, в остальных случаях для встроенных команд статус устанавливается в значение 0. |
time | Управляет автоматическим отсчетом времени для команд. Если эта переменная установлена, то при завершении некоторой команды, которая использует больше положенных для нее секунд центрального процессора, будет печататься строка, содержащая следующую информацию: пользователя, систему, реальное значение времени и процентное соотношение использования времени, которое определяется отношением суммы времени, использованного пользователем и системой к реальному времени. |
verbose | Устанавливается при помощи опции -v, заданной в командой строке; приводит к печати слов из каждой команды после выполнения подстановки предыстории. |
Выполнение Невстроенных Команд
При обнаружении команды, которая не является встроенной, но
должна быть выполнена, интерпретатор shell пытается выполнить
эту команду через команду exec(3). Каждое слово в переменной
path задает имя каталога, из которого интерпретатор shell будет пытаться выполнить эту команду. Если не заданы ни опция
-c, ни опция -t, то интерпретатор shell будет выполнять хэширование таких имен в этих каталогах во внутреннюю таблицу таким образом, что он будет пытаться применить exec только в каталоге, в котором, возможно, находится эта команда. Это повышает скорость обнаружения команды в случае, когда в пути поиска представлено большое количество каталогов. Если этот механизм будет выключен (посредством команды unhash), или если интерпретатору shell будет задан с аргументами -c или -t, и, во
всяком случае, для каждого каталога, являющего составляющей
переменной path, которая не начинается с символа /, интерпретатор shell выполняет конкатенацию с именем заданной команды,
чтобы сформировать полное обозначение пути к файлу, который он
затем пытается выполнить.
Команды, заключенные в круглые скобки, всегда выполняются в подмножестве интерпретатора subshell. Так, команда (cd; pwd) ; pwd печатает каталог home; оставляя при этом Вас там, где Вы были (отображая это место после каталога home), в то время как команда cd ; pwd оставляет Вас в этом входном каталоге home. Заключенные в круглые скобки команды довольно часто используются для предотвращения воздействие текущего интерпретатора shell на команду cd.
Если файл имеет разрешения на выполнение, но не является двоичным выполняемым файлом в данной системе, то считается, что этот файл содержит команды интерпретатора shell, и для того, чтобы считать его, подгружается новый интерпретатор shell.
Если для shell существует псевдоним, то, чтобы сформировать команду интерпретатора shell, для списка аргументов подготавливаются слова псевдонима. Первое слово псевдонима должно быть полным обозначением пути интерпретатора shell (например, $shell). Заметим, что это специальный, встречающийся позже случай подстановки псевдонима, и допускает только слова, которые должны быть подготовлены для списка аргументов, без модификации.
Обработка Списка Аргументов
Если нулевым аргументом для интерпретатора shell является знак
-, то это интерпретатор shell вхождения в систему. Аргументы в
виде флагов интерпретируются следующим образом:
-c | Команды считываются из (отдельного) следующего аргумента, который должен быть представлен. Все остальные аргументы помещаются в переменную argv. |
---|---|
-e | Интерпретатор shell завершается, если любая вызванная команда заканчивается не нормально, или получен ненулевой статус выхода. |
-f | Интерпретатор shell будет запускаться быстрее, поскольку ни для одной выполняемой команды из файла .cshrc не будет производиться поиск во входном (home) каталоге вызвавшего пользователя. |
-i | Интерпретатор shell выполняется в интерактивном режиме и выводит приглашение для своего ввода верхнего уровня даже, если ввод производится не с терминала. Все процессы shell выполняются в интерактивном режиме без установки этой опции, если устройствами их ввода и вывода являются терминалы. |
-n | Команды подвергаются синтаксическому анализу, но не выполняются. Эта опция может быть полезна при синтаксической проверке сценариев интерпретатора shell. |
-s | Входные команды поступают с устройства стандартного ввода. |
-t | Считывается и выполняется одна строка ввода. Символ \ может быть использован для отмены признака новой строки в конце данной строки и продолжения ее текста на другой строке. |
-v | Вызывает установку переменной verbose, действием которой является отображение на экране ввода команд после выполнения подстановки предыстории. |
-x | Вызывает установку переменной echo, действием которой является отображение на экране команд непосредственно перед их выполнением. |
-V | Вызывает установку переменной verbose непосредственно перед выполнением файла .cshrc. |
-X | Вызывает установку переменной echo непосредственно перед выполнением файла .cshrc. |
После обработки аргументов в виде флагов, и если остались аргументы arg..., но не были заданы опции -c, -i, -s или -t, то выбирается первый аргумент из списка arg ... в качестве имени файла команд, предназначенных для выполнения. Интерпретатор shell открывает этот файл и сохраняет его имя для возможного выполнения повторной подстановки по $0. В типичной системе большинство сценариев интерпретатора shell пишется для стандартного интерпретатора shell (см. команду sh(1)), интерпретатор shell в синтаксисе языка С будет выполнять каждый стандартный интерпретатор shell, если первым символом сценария не будет символ # (т.е. если сценарий не начинается с комментария). Оставшиеся аргументы инициализируют переменную argv.
Обработка Сигналов
Интерпретатор shell обычно игнорирует сигналы quit. Сигналы
interrupt и quit игнорируются для вызываемой команды, если за
этой командой следует символ &; во всех остальных случаях эти
сигналы имеют те значения, которые наследуются интерпретатором
shell от породившего его процесса. Обработка прерываний процессами shell может быть управляемой при помощи onintr. Интерпретаторы shell вхождения в систему перехватывают сигнал
terminate; в остальных случаях этот сигнал поступает к порожденному процессу из того состояния, в котором он был в процессе, породившем интерпретатор shell. Ни в коем случае не разрешаются прерывания, когда интерпретатор shell считывает файл
.logout.
ФАЙЛЫ
~/.cshrc | Считывается каждым интерпретатором shell в начале выполнения |
/etc/cshrc | Системно-расширенный файл cshrc по умолчанию, если никакой не представлен |
~/.login | Считывается интерпретатором shell вхождения в систему после файла .cshrc во время выполнения вхождения в систему |
~/.logout | Считывается интерпретатором shell вхождения в систему во время выполнения выхода из системы |
/bin/sh | Интерпретатор shell для сценариев, не начинающихся с символа # |
/tmp/sh* | Временный файл для ввода при помощи << |
/dev/null | Источник пустого файла |
/etc/passwd | Источник входных (home) каталогов для ~name |
ОГРАНИЧЕНИЯ
Длина слов не может быть больше 512 символов. Число аргументов
для команды, которая вызывает раскрытие имен файлов, ограничивается 1/6 от числа символов, разрешенных в списке аргументов,
которое составляет 5120, меньше, чем символов в среде. Кроме
того, подстановки команд не могут подставить символов больше,
чем разрешено в аргументном списке.
В целях обнаружения зацикливаний интерпретатор shell ограничивает количество подстановок псевдонимов на одной строке до 20.
СМОТРИТЕ ТАКЖЕ
access(3), exec(3), fork(3), pipe(3), signal(3), umask(3),
wait(3), environ(5).
РАЗРЕШЕНИЕ
Эта утилита была разработана в Калифорнийском Университете,
г.Беркли, и разрешена к использованию.
ЗАМЕЧАНИЕ
Встроенные команды структуры управления, такие как
foreach и while, не могут быть использованы с символами |, &
или ; .
Команды внутри циклов, приглашения которых имеют символ ?, не помещаются в список предыстории команды history.
Нельзя использовать модификаторы двоеточия (:) на выходе подстановок команд.
Интерпретатор С-shell имеет много встроенных команд с теми же именами и функциями, что и у команд интерпретатора shell Баурна. Тем не менее, синтаксис таких команд зачастую различается. Одним из таких примеров является команда nice, другим - команда echo. Следует использовать соответствующий корректный синтаксис при работе с этими встроенными командами интерпретатора С-shell.
Когда пользователь С-shell входит в систему, система считывает и выполняет команды из файла /etc/cshrc перед тем, как выполнить команды из пользовательского файла $HOME/.schrc. Следовательно, Вы можете модифицировать среду интерпретатора С-shell для всех пользователей системы, отредактировав файл /etc/cshrc.
Во время выполнения аппаратной загрузки системы, нажатие клавиши delete, как только интерпретатор С-shell выведет приглашение (%), может вызвать завершение работы интерпретатора shell. Если при этом команда csh является интерпретатором shell вхождения в систему, то будет произведен выход пользователя из системы.
Команда csh пытается импортировать и экспортировать переменную PATH для ее использования вместе со обычными сценариями интерпретатора shell. Это работает только для простых случаев, когда переменная PATH не содержит командных символов.
Данная версия команды csh не поддерживает или не использует тех средств управления процессами, которые имеются в 4-ой версии, разработанной в Беркли.