[ Страница назад | Страница вперед | Содержание | Индекс | Домой | Юридическая информация | Поиск ]

Руководство пользователя: Операционная система и устройства


Команды оболочки C

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

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

&       |      ;        
&&      ||    <<        > >
<       >     (          )

Эти специальные символы могут быть частью других слов. Однако если перед ними указать символ \, то оболочка не будет интерпретировать такие символы как специальные. Строки, заключенные в ' ', " " (пары совпадающих кавычек) или обратные кавычки, также могут быть частью слов. Пробелы, символы табуляции и специальные символы не рассматриваются как отдельные слова, если не заключены в кавычки. В текст можно вставить символ новой строки, указав перед ним символ \.

Первым словом простой командной последовательности (под номером 0) обычно является имя команды. Остальные слова, за некоторыми исключениями, передаются этой команде как аргументы. Если в команде указан исполняемый файл, в котором хранится откомпилированная программа, оболочка запускает его. Если файл отмечен как исполняемый, но не является откомпилированной программой, оболочка рассматривает этот файл как сценарий. В этом случае запускается другой экземпляр оболочки (подоболочка), читающий указанный файл и выполняющий его команды.

В этом разделе приведена информация по следующим темам:

Встроенные команды оболочки C

Обычно встроенные команды выполняются внутри оболочки. Но если встроенная команда встретится как любой компонент конвейера, кроме последнего, для нее будет создана отдельная оболочка.

Примечание: При вводе команды в приглашении оболочки C система сначала ищет встроенную команду. Если встроенная команда не существует, выполняется поиск команды системного уровня в каталогах, указанных в переменной оболочки path. Имена некоторых встроенных команд оболочки C совпадают с именами команд операционной системы. Однако эти команды не обязательно работают одинаково. Для того чтобы выяснить, для чего служит та или иная команда, ознакомьтесь с ее описанием.

Если первая строка запускаемого сценария начинается с #!/Полное_имя_оболочки, то оболочка C для выполнения этого сценария запускает указанную оболочку. В противном случае, запускается оболочка по умолчанию (связанная с /usr/bin/sh). Оболочка по умолчанию может не поддерживать встроенные команды оболочки C. Для того чтобы сценарий выполнялся оболочкой C, в его первой строке должно быть указано #!/usr/bin/csh.

Полный перечень встроенных команд в алфавитном порядке приведен в разделе Список встроенных команд оболочки C.

Описание команд оболочки C

Оболочка C содержит следующие встроенные команды:

alias [Имя [Список_слов]] Если параметры не указаны, то команда показывает все определенные псевдонимы. С параметром Имя команда показывает все псевдонимы этого имени. Если указан параметр Список_слов, команда присваивает значение Список_слов псевдониму Имя. В качестве Имени нельзя указывать команды alias и unalias.
bg [%Задание ...] Переводит текущее или указанное в параметре Задание задание в фоновый режим, возобновляя его работу, если она была остановлена.
break Возобновляет выполнение команд после оператора end, закрывающего ближайшую команду foreach или while.
breaksw Прерывает выполнение команды switch; возобновляет выполнение после оператора endsw.
caseМетка: Задает Метку для команды switch.
cd [Имя] Эквивалентна команде chdir (см. ниже).
chdir [Имя] Изменяет текущий каталог на указанный в параметре Имя. Если Имя не указано, команда изменяет текущий каталог на ваш домашний. Если Имя - не подкаталог текущего каталога и не начинается с /, ./ или ../, то оболочка просматривает все элементы переменной среды cdpath в поисках подкаталога с именем Имя. Если Имя - это имя переменной среды, значение которой начинается с /, то оболочка пытается рассматривать это значение как каталог. Команда chdir эквивалентна команде cd
continue Продолжает выполнение после оператора end ближайшей команды while или foreach.
default: Отмечает вариант по умолчанию (default) в операторе switch. Оператор default должен находиться после всех остальных меток case.
dirs Показывает стек каталогов.
echo Записывает символьные строки в стандартный вывод оболочки.
else Запускает команды, следующие за вторым оператором else в последовательности команд if (Выражение) then ... else if (Выражение2) then ... else ... endif.
end Присваивает переменной Имя последовательно элементы из списка, указанного в параметре Список, и запускает последовательность Команд, расположенную между оператором foreach и соответствующим ему end. Операторы foreach и end должны находиться на отдельных строках.

Оператор continue начинает следующий цикл, оператор break прерывает цикл. При вводе команды foreach с терминала оболочка C выдает приглашение ? для ввода Команд. Команды, введенные в приглашении ? и выполненные внутри цикла, не добавляются в список хронологии.

endif Если Выражение истинно, запускает Команды, следующие за первым оператором then. Иначе, если Выражение2 из оператора else if истинно, запускает Команды, следующие за вторым оператором then. Если Выражение2 после else if ложно, запускает Команды, следующие за последним else. Допустимо любое количество пар elseif. При этом необходим только один завершающий оператор endif. Раздел, начинающийся с else, необязателен. Слова else и endif могут стоять только в начале строк. Раздел if должен либо быть единственным в строке ввода, либо следовать за командой else.
endsw Сравнивает метки case со значением переменной Строка. Строка - это команда или имя файла с выполненными подстановками. В метках case переменной длины следует применять символы сравнения с шаблоном *, ? и [ . . . ]. Если ни одна из меток перед default не будет выбрана, управление будет передано на метку default. Метки case и метка default должны находиться в начале строк. Команда breaksw продолжает выполнение после команды endsw. В ее отсутствие управление будет передаваться по меткам case и default, как в языке C. Если ни одна из меток не будет выбрана и метка default отсутствует, то выполнение будет продолжено после команды endsw.
evalПараметр . . .  Рассматривает значение Параметр как входные данные для оболочки и выполняет соответствующие команды внутри текущей оболочки. Эта команда часто применяется для запуска других команд, имена которых получены в результате выполнения команды или подстановки переменных, поскольку анализ выполняется до подстановки.
execКоманда Запускает указанную Команду вместо текущей оболочки.
exit [(Выражение)] Завершает работу оболочки, используя значение переменной среды status (если не задано Выражение), либо значение Выражения.
fg [%Задание ...] Переводит текущее или указанное в параметре Задание задание в интерактивный режим, возобновляя его работу, если она была остановлена.
foreachИмя (Список) Команда. . .   Поочередно присваивает переменной Имя значения из Списка и выполняет последовательность команд до оператора end.
globСписок Показывает Список с учетом подстановки хронологии, переменных и имен файлов. Помещает между словами символ с нулевым кодом и не добавляет в конец строки возврат каретки.
gotoСлово Продолжает выполнение со строки, указанной в параметре Слово. Слово - это имя файла и команда, в результате подстановки которых получается строка в форме Метка: . Оболочка просматривает входные данные на максимально возможную длину для поиска строки в форме Метка:, перед которой может стоять несколько пробелов или знаков табуляции.
hashstat Показывает статистику работы хэш-таблицы поиска команд.
history [-r | -h] [n] Показывает список хронологии. Самые старые события показываются первыми. Если указать число в параметре n, будет показано только n последних событий. С флагом -r события будут показаны в обратном порядке - начиная с самых новых. С флагом -h список хронологии выводится без нумерации. При этом могут быть созданы файлы, допустимые в качестве входных для команды source с флагом -h.
if (Выражение) Команда Запускает указанную Команду (с аргументами), если Выражение истинно. Подстановка переменных в Команде выполняется в самом начале, одновременно с оператором if. Команда должна представлять собой простую команду (а не конвейер или список команд, даже заключенный в скобки).

Примечание: Перенаправление ввода и вывода выполняется даже в том случае, если Выражение ложно и Команда не выполняется.
jobs [-l] Показывает список активных заданий. С флагом -l команда jobs кроме номеров и имен заданий показывает идентификаторы процессов.
kill -l | [[-Сигнал] % Задание...|PID...] Отправляет сигнал TERM (завершить) или другой Сигнал указанному Заданию или процессу (PID). Сигналы указываются либо по номеру, либо по имени (согласно файлу /usr/include/sys/signal.h, но без префикса SIG). Команда с параметром -l выдает список сигналов.
limit [-h] [Ресурс [Максимум]] Ограничивает использование указанного ресурса для текущего процесса и всех процессов, им созданных. Ограничения на использование ресурсов хранятся в файле /etc/security/limits. Вы можете ограничить время центрального процессора (CPU), размер файлов, размер данных, размер дампа памяти и размер памяти. Максимальные значения задаются командой mkuser при добавлении пользователя в систему. Эти значения затем можно изменить командой chuser.

Все ограничения делятся на гибкие и жесткие. Пользователи могут увеличивать гибкие ограничения вплоть до жестких. Для увеличения жесткого ограничения или для указания такого гибкого ограничения, которое будет превышать жесткое, необходимы права пользователя root. С флагом -h будут показаны жесткие ограничения, без него - гибкие.

Если параметр Максимум не указан, команда limit показывает текущее ограничение на использование указанного ресурса. Если параметр Ресурс также не указан, команда limit показывает текущие ограничения на использование всех ресурсов. Дополнительная информация о ресурсах, контролируемых командой limit, приведена в описании функций getrlimit, setrlimit и vlimit в руководстве AIX 5L Version 5.1 Technical Reference: Base Operating System and Extensions Volume 1.

Параметр Максимум для времени использования CPU указывается в формате чч:мм:сс. Для других ресурсов Максимум указывается в виде числа с плавающей точкой или целого, которое может быть дополнено масштабным коэффициентом. Допустимы следующие масштабные коэффициенты: k (килобайты, 1 килобайт=1024 байт), m (мегабайты) и b (блоки - единицы, применяемые функцией ulimit; см. руководство AIX 5L Version 5.1 Technical Reference: Base Operating System and Extensions Volume 2). Если масштабный коэффициент не указан, то считается, что размер всех ресурсов задан в килобайтах. Для имен ресурсов и масштабных коэффициентов можно применять однозначные сокращения.

Примечание: Данная команда ограничивает объем физической памяти, доступной процессу, только в том случае, если ее не хватает другим активным процессам.
login Завершает работу начальной оболочки и заменяет ее экземпляром команды /usr/bin/login. Это один из способов выхода из системы (поддерживается в целях совместимости с командами оболочек ksh и bsh).
logout Завершает работу начальной оболочки. Данная команда необходима в случае, если установлена опция ignoreeof.
nice [+n] [Команда] Без параметров устанавливает приоритет выполнения команд в оболочке равным 24. С флагом +n увеличивает приоритет на указанное значение (n). Если с параметром +n указана Команда, запускает Команду с приоритетом 24 плюс указанное значение. Пользователь с правами root может вызывать команды nice с отрицательным числом в параметре. Команда всегда запускается в отдельной оболочке с теми же ограничениями, что и команды в простом операторе if.
nohup [Команда] Если Команда не указана, сигналы hangup игнорируются до завершения сценария. Если Команда указана, сигналы hangup игнорируются во время работы этой команды. Для запуска конвейера или списка команд поместите их в сценарий оболочки, разрешите для него выполнение и укажите этот сценарий в качестве Команды. Все процессы, запущенные в фоновом режиме со знаком &, уже защищены от получения сигнала hangup при выходе пользователя из системы. Однако этим процессам все равно можно отправить сигнал hangup явно, если для них не был запущен оператор nohup.
notify [%Задание...] Указывает заданию отправлять уведомления об изменении состояния текущего или указанного Задания асинхронно. Обычно оболочка отправляет уведомления перед выводом приглашения. При задании переменной оболочки notify это свойство включается автоматически.
onintr [- | Метка] Управляет реакцией оболочки на прерывания. Если аргументы не указаны, восстанавливает реакцию оболочки на прерывания по умолчанию, при которой сценарии оболочки завершаются, и управление передается командной строке. Если указан флаг -, все прерывания игнорируются. Если указана Метка, оболочка выполняет команду goto Метка, когда получает прерывание или когда ее подпроцесс завершается прерыванием. В любом случае, если оболочка работает автономно, и все прерывания игнорируются, то все формы команды onintr не выполняют никаких действий. Прерывания будут и дальше игнорироваться оболочкой и всеми запущенными командами.
popd [+n] Выталкивает имя каталога из стека и переходит в этот каталог. Если указан параметр +n, команда применяет n-й элемент стека. Элементы нумеруются от вершины стека, начиная с нуля.
pushd [+n|Имя] Без аргументов меняет местами два верхних элемента стека каталогов. С параметром Имя команда сохраняет текущий каталог в стеке каталогов (указанном в переменной среды cwd) и переходит в новый каталог. Если указано +n, команда получает из стека n-й каталог и переходит в него. Элементы стека каталогов нумеруются от вершины стека, начиная с нуля.
rehash Повторно создает внутреннюю хэш-таблицу содержимого каталогов, указанных в переменной оболочки path. Это необходимо, если после входа в систему в каталоги path были добавлены новые команды. Команда rehash применяется только в том случае, если команды были добавлены в собственные каталоги пользователя или если содержимое системных каталогов было изменено другим пользователем.
repeatЧисло Команда Запускает Команду, удовлетворяющую тем же ограничениям, что и команда в простом операторе if, указанное Число раз.

Примечание: Перенаправления ввода-вывода выполняются ровно один раз, даже если Число равно 0.
set [[Имя[n]] [ =Слово]] | [Имя = (Список)] Без аргументов показывает значения всех переменных оболочки. Переменные, значение которых состоит из нескольких слов, показываются в виде списка, заключенного в скобки. Если указано только Имя, оболочка C присваивает переменной Имя пустую строку. Иначе переменной Имя присваивается значение Слово или Список слов. Если указано число n, то n-му компоненту переменной Имя присваивается значение Слово; n-й компонент должен существовать. Во всех случаях в команде и имени файла выполняются все подстановки. Для изменения нескольких значений в одной команде set аргументы могут повторяться. Однако подстановка переменных во всех аргументах выполняется до присваивания значений.
setenv Имя Значение Присваивает переменной среды с именем Имя строку символов Значение. Наиболее часто используемые переменные среды - USER, TERM, HOME и PATH - автоматически импортируются и экспортируются в переменные user, term, home и path оболочки C. К ним нет необходимости применять команду setenv.
shift [Переменная] Сдвигает элементы переменной оболочки argv или другой Переменной влево. Если переменная оболочки argv (или указанная Переменная) не установлена или длина ее значения менее одного слова, выдается сообщение об ошибке.
source [-h] Имя Считывает команды, указанные в параметре Имя. Команды source могут быть вложены друг в друга. Однако при слишком большой глубине вложенности у оболочки могут закончиться дескрипторы файлов. Ошибка в команде source любого уровня вложенности завершает все команды source. Обычно входные данные во время выполнения команды source не добавляются в список хронологии. Команда с флагом -h помещает команды в список хронологии, не выполняя их.
stop [%Задание ...] Останавливает текущее или указанное Задание, работающее в фоновом режиме.
suspend Приостанавливает оболочку, имитируя получение сигнала STOP.
switch (Строка) Начинает последовательность команд switch (Строка) case Строка1: ... breaksw default: ... breaksw endsw. Эта команда сравнивает каждую метку оператора case со значением переменной Строка. Если ни одно совпадение не найдено, то выполняется действие, связанное с меткой default.
time [Команда] Команда time автоматически определяет время выполнения команд. Если Команда не указана, time показывает отчет о времени, использованном данной оболочкой и ее потомками. Если Команда указана, будет показано время ее выполнения. Формат отчета об использованном времени определяется значением переменной оболочки time. При необходимости, для показа статистики по времени после завершения команды создается дополнительная оболочка.

Пример применения команды time к команде sleep приведен ниже:

time sleep

Вывод этой команды может выглядеть следующим образом:

0.0u 0.0s 0:00 100% 44+4k 0+0io 0pf+0w

Значения перечисленных полей объясняются ниже:

Поле
Описание

1
Время, затраченное CPU на пользовательский процесс, в секундах.

2
Время, затраченное CPU на выполнение функций ядра для пользовательского процесса.

3
Внешнее время, прошедшее при выполнении команды.

4
Полное пользовательское время (1) плюс системное время (2), в процентах от прошедшего времени (3).

5
Средний объем задействованной общей памяти плюс средний объем частного пространства данных, в килобайтах.

6
Число операций блочного ввода и вывода.

7
Число страничных сбоев плюс число операций подкачки.
umask [Значение] Определяет права доступа к файлу. Это Значение, вместе с правами доступа создающего процесса, задает права доступа к создаваемому файлу. Значение по умолчанию: 022. Если Значение не указано, будет показано текущее значение.
unalias *|Шаблон Удаляет все псевдонимы с именами, соответствующими Шаблону. Для удаления всех псевдонимов введите unalias *. Отсутствие псевдонимов не приводит к ошибке.
unhash Отменяет применение внутренней хэш-таблицы для нахождения запускаемых программ.
unlimit [-h][Ресурс] Отменяет ограничение на использование Ресурса. Если Ресурс не указан, удаляются все ограничения на использование ресурсов. Список имен Ресурсов приведен в описании команды limit.

С флагом -h команда удаляет соответствующие жесткие ограничения. Жесткие ограничения могут быть изменены только пользователем с правами доступа root.

unset *|Шаблон Удаляет все переменные с именами, соответствующими Шаблону. Для удаления всех переменных введите unset *. Если ни одна переменная не задана, это не приводит к ошибке.
unsetenvШаблон Удаляет все переменные среды, имена которых соответствуют Шаблону. (См. также встроенную команду setenv)
wait Ожидает завершения всех фоновых заданий. В интерактивном задании ожидание может быть прервано сигналом INTERRUPT (обычно вызываемым комбинацией клавиш Ctrl-C). После этого оболочка показывает имена и номера всех оставшихся заданий.
while (Выражение) Команда. . .  end Выполняет Команды, указанные между операторами while и соответствующим ему end, пока Выражение не примет нулевое значение. Для завершения цикла служит команда break; для продолжения цикла - continue. Операторы while и end должны находится на отдельных строках. При вводе с терминала после команды while (Выражение) будет показано приглашение, похожее на приглашение команды foreach.
@[Имя[n]=Выражение] Без аргументов показывает значения всех переменных среды. С аргументами присваивает переменной Имя значение Выражения. Если часть выражения содержит символы < , > , & или | , она должна быть заключена в скобки. Если указано число n, значение Выражения присваивается n-му компоненту переменной Имя. Переменная Имя и ее n-й компонент должны существовать.

Допустимы операторы языка C, такие как *= и += . Пробелы, отделяющие Имя от оператора присвоения, необязательны. Однако для отделения компонентов Выражения, которые иначе читались бы как одно слово, пробелы необходимы. Специальные постфиксные операторы двойной плюс (++) и двойной дефис (- -) соответственно увеличивают или уменьшают значение переменной Имя.

Выражения и операторы оболочки C

Встроенная команда @ и операторы exit, if и while допускают использование выражений, соответствующих правилам и приоритету операций языка C. Допустимы следующие операторы:

Оператор Значение
() изменение порядка действий
~ поразрядное отрицание
! отрицание
*/ % умножение, деление и взятие остатка
+ - сложение и вычитание
<< > > Сдвиг влево, сдвиг вправо
<= >= < > сравнение
== != =~ !~ сравнение строк со строками и шаблонами
& поразрядное И
^ поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ
| поразрядное ИЛИ
&& логическое И
|| логическое ИЛИ

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

Примечание: Операторы + и - вычисляются справа налево. Например, a + b - c вычисляется как

a + (b - c)

а не как

(a + b) - c

Операторы ==, !=, =~ и !~ сравнивают аргументы как строки, все остальные операторы работают с числами. Операторы =~ и !~ действуют аналогично == и !=, за исключением того, что в правой части может стоять шаблон, с которым сравнивается левая часть. Эта возможность в некоторых случаях избавляет от необходимости применения в процедурах оболочки оператора switch.

Также применяются логические операторы ИЛИ (||) и И (&&). Ниже приведен пример проверки диапазона с их помощью:

if ($#argv > 2 && $#argv < 7) then

В этом примере число аргументов должно быть больше двух, но меньше семи.

Строки, начинающиеся с нуля (0), рассматриваются как восьмеричные числа. Пустые или отсутствующие аргументы считаются нулевыми. Все результаты вычисления выражений сохраняются в строках в виде десятичных чисел. Обратите внимание, что два компонента выражения могут быть объединены в одном слове. Кроме некоторых операторов, важных для анализа (& | < > ( )), компоненты выражения должны быть разделены пробелами.

В качестве простых операндов в выражениях также допустимы команды, заключенные в ( ), и запросы к файлам в форме (-операторИмя_файла), где оператор - один из следующих символов:

r Доступ для чтения
w Доступ для записи
x Доступ для выполнения
e Существование
o Владелец
z Нулевой размер
f Простой файл
d Каталог

После выполнения всех подстановок система проверяет, есть ли у текущего пользователя указанные права доступа к заданному файлу Имя_файла. Если файл Имя_файла не существует или недоступен, все запросы считаются ложными (возвращают 0). Если команда выполняется успешно, запрос возвращает истину (1). Иначе возвращается значение ложь (0). Для более подробного разбора состояния запустите команду вне выражения, затем проанализируйте переменную оболочки status.

Подстановка команд в оболочке C

Подстановка команд означает, что оболочка выполняет указанную команду и заменяет эту команду ее выводом. Для выполнения подстановки команд в оболочке C заключите текст этой команды в обратные апострофы (` `). Обычно оболочка делит вывод команды на отдельные слова, разделенные пробелами, знаками табуляции и переводами строки. Затем исходная команда заменяется полученным выводом.

В следующем примере обратные апострофы (``) вокруг команды date указывают на необходимость подстановки вывода этой команды:

echo Текущие дата и время: `date`

Вывод этой команды может выглядеть следующим образом:

Текущие дата и время: пятница 25 сентября 1998 г. 19.38.41

Оболочка C выборочно выполняет подстановку в аргументах встроенных команд оболочки. Это означает, что оболочка не подставляет невычисленные части выражений. Для внешних команд оболочка подставляет имя команды отдельно от списка аргументов. Подстановка выполняется в отдельной оболочке, после перенаправления ввода и вывода.

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

Выполнение внешних команд в оболочке C

Когда оболочка C обнаруживает, что введенная команда не является встроенной, она пытается запустить эту команду системным вызовом execv. Каждое слово в переменной оболочки path интерпретируется как каталог для запуска команды. Если ни флаг -c, ни флаг -t не были указаны, оболочка хранит имена файлов из этих каталогов во внутренней хэш-таблице. Системный вызов exec выполняется только тогда, когда существует вероятность нахождения команды в одном из каталогов. Если выключить этот механизм командой unhash или указать для среды флаг -c или -t, к указанному имени команды будет добавлен каталог для образования полного пути. Эта операция в любом случае выполняется для каждого компонента переменной path, не начинающегося с /. Затем оболочка пытается запустить команду.

Команды, заключенные в скобки, всегда выполняются в отдельной оболочке. Например, команда:

(cd ; pwd) ; pwd

показывает домашний каталог, не меняя текущий каталог, а команда

cd ; pwd 

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

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

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


[ Страница назад | Страница вперед | Содержание | Индекс | Домой | Юридическая информация | Поиск ]