- •«Работа в ос unix/Linux и программирование на языке shell»
- •Интерпретатор команд (shell)
- •Структура команд unix
- •Простые команды
- •Стандартные ввод и вывод
- •Параметры
- •Составные команды
- •Специальные символы и подстановка значений
- •Переменные
- •Логические выражения и операторы управления
- •Оператор if:
- •Оператор while:
- •Оператор until:
- •Оператор case:
- •Оператор for:
- •Альтернативная форма оператора for:
- •Оператор select:
- •Оператор break:
- •Оператор continue:
- •Оператор shift:
- •Арифметические выражения
- •Работа пользователя в системе unix
- •Начало и завершение работы в системе
- •Запуск и выполнение команд
- •Фоновые процессы и управление заданиями
- •Скрипты
- •Некоторые команды
- •Справочные команды
- •Man [том]имя_команды
- •Info имя_команды
- •Help имя_встроенной_команды
- •Информационные команды
- •Ls [ключи] параметры
- •History [-c] [число]
- •Hostname [ключи]
- •Ps [ключи]
- •Uname [ключи]
- •Date [ключи] [новая_дата]
- •Cal [ключи] [месяц [год]]
- •Du [ключи] [список_имен]
- •Stat [список_имен]
- •Mv файл1 файл2илиmvсписок_файловкаталог
- •Find список_каталогов [ключи]
- •Rmdir [ключи] список_каталогов
- •Cat список_файлов
- •Команды для работы с данными
- •Echo [ключи] параметры
- •More [файл]
- •Sort [ключи] [-k от_поля [, до_поля]] [список_файлов]
- •Cut [ключи] [файлы]
- •Команды управления процессами
- •Testсписок_аргументов
- •Read [ключи] [список_переменных]
- •Getopts строка_ключей переменная [список_слов]
- •Примеры команд и скриптов
- •Примеры команд интерактивного режима
- •Создание текстового файла
- •Работа с файлами
- •Определить трех пользователей системы, чьи домашние каталоги с содержащимися в них файлами занимают больше всего дискового пространства
- •Примеры скриптов
- •Выдать имена всех файлов каталога-параметра и всех его подкаталогов, отступами показывая вложенность каталогов. Если параметр не задан, начать с текущего каталога.
- •Порядок выполнения работы
- •Примеры заданий на использование команд в интерактивном режиме
- •Список вариантов заданий на разработку командных файлов
- •Контрольные вопросы
Запуск и выполнение команд
В интерактивном (диалоговом) режиме работы шелл выдает первичное приглашениек вводу команды, вид которого определяется системной переменнойPS1. Стандартный вид приглашения $ для обычного пользователя или # для суперпользователя (администратора). В приглашение часто входит также имя текущего каталога файловой системы. Если пользователь вводит законченную команду (простую или составную), она выполняется. Если команда синтаксически не закончена, шелл выводит в следующих строкахвторичное приглашение, определяемое переменнойPS2(обычно знак >), пока команда не будет введена полностью. Пользователь может явно указать, что ввод команды не закончен (например, будут еще аргументы), для этого нужно в конце строки ввести\(т.е. как бы «заэкранировать» символ перевода строки).
Шелл bashпредоставляет пользователю удобные средства, облегчающие интерактивный ввод команд. Одним из таких средств является завершение частично набранных команд и их параметров. Для этого пользователь может при наборе команды ввести с клавиатуры один или несколько символов, а затем нажать клавишуTAB. При этомbashпрежде всего пытается «догадаться», что именно сейчас вводит пользователь: имя команды, имя файла-параметра, обращение к переменной или что-то еще. Если вводимое слово начинается с символа$, то шелл считает, что это имя переменной, и пытается найти это имя по первым символам среди имеющихся переменных. Если вводится первое слово команды,bashсчитает, что это имя команды и пытается найти завершение среди всех доступных команд. В случае, если введено недостаточно символов (имеется несколько подходящих имен), шелл выдает для справки все возможные завершения вводимого слова.
Другое средство упрощения ввода команд связано с использованием «истории», т.е. списка последних вводившихся команд. Длина списка по умолчанию равна 500 командам. Весь список может быть выдан с помощью команды history. Простейшее использование истории связано с перемещением по списку при помощи клавиши. Имеются и более тонкие возможности, например, выбор команд по номеру в списке, конструирование новой команды из отдельных частей предыдущих команд и др.
Для использования возможностей завершения слов и выбора из истории нужно либо выйти из оболочки mc, либо, по крайней мере, отключить экранmcс помощью комбинацииCtrl+O.
Фоновые процессы и управление заданиями
Начиная выполнять внешнюю команду, шелл создает новый процесс для этой команды, а в случае конвейера – по процессу для каждой команды. При этом процесс выполнения самого шелла обычно приостанавливается до завершения процесса выполнения команды. Имеется, однако, возможность запуска команды в фоновом режиме, без ожидания ее завершения. Для этого следует завершить запись команды символом&. При этом система создает новый процесс и выдает на терминал строку примерно следующего вида:
[1] 7841
Здесь число в квадратных скобках – порядковый номер фонового задания, а второе число –идентификатор процессавыполнения команды. Идентификатор процесса – это целое число, уникальное для каждого процесса в системе. Для конвейера выдается идентификатор процесса последней команды.
Затем шелл, не ожидая завершения фонового процесса, выдаст приглашение к вводу следующей команды. Фоновый процесс будет выполняться параллельно с запустившим его шеллом. Пользователь может таким же способом запустить произвольное количество параллельно выполняющихся фоновых процессов. При этом шелл и команды, которые будут запускаться обычным образом, работают как процессы переднего плана. Основное отличие заключается в том, что процессы переднего плана имеют связь с терминалом, т.е. могут читать ввод с клавиатуры и выводить данные на экран, а фоновые процессы при попытке выполнить ввод с терминала переходят в приостановленное состояние.
Пользователь может приостановить выполнение процесса переднего плана. Для этого используется специально назначенная комбинация клавиш, как правило, Ctrl+Z.
Понятие задания, в отличие от понятия процесса, существует не во всех версиях UNIXи используется не всеми вариантами шелла. Вbashзаданием считается команда, или конвейер, или список команд, запущенные в фоновом режиме с использованием знака&. Команда или список команд, выполняющийся на переднем плане, также считается отдельным заданием, хотя в списке заданий появляется только в случае приостановки. Понятие задания удобно для манипуляции процессами: приостановки процесса, его перевода в фоновый режим или, наоборот, на передний план.
Шелл отслеживает изменения состояния заданий и, как правило, сообщает о них перед выдачей очередного приглашения к вводу команды. Возможными состояниями являются Running(работает в фоновом режиме),Stopped(приостановлено),TerminatedилиKilled(прекращено командойkill),Done(завершено). Последним состоянием фонового процесса обычно бываетDone, а если процесс завершился с ненулевым кодом завершения, то в круглых скобках будет указан этот код.
Любое из имеющихся заданий, как приостановленных, так и выполняющихся в фоновом режиме, может быть продолжено либо на переднем плане (команда fg %спецификация_задания), либо как фоновое (командаbg %спецификация_задания).
В качестве спецификации конкретного задания можно использовать либо его номер (тот, который указывается системой в квадратных скобках), либо имя выполняемой в задании команды, либо даже часть этого имени, лишь бы эта часть позволяла однозначно выбрать задание среди всех выполняемых заданий. Спецификация %словоозначает задание, командная строка запуска которого начиналась с указанного слова. Спецификация%?словоозначает задание, в командной строке запуска которого указанное слово содержится в любом месте. Например, любая из спецификаций%prили%?myможет означать задание, выполняющее командуprog1 myfile.c.
Спецификация %+означает задание, которое последним было запущено в фоновом режиме или приостановлено (текущее задание), а спецификация%-– предыдущее задание.
Пользователь может «убить» фоновый или приостановленный процесс с помощью команды kill(см. описание команд). Для этого нужно знать либо идентификатор процесса, либо спецификацию задания.
Команда jobsвыводит список всех заданий с указанием их состояния.
Фоновый процесс имеет возможность выдавать сообщения на терминал, однако этим следует пользоваться осторожно, поскольку выдача фонового процесса будет смешиваться на экране с выдачей процесса переднего плана. В некоторых случаях терминал находится в монопольном владении процесса переднего плана, тогда для фонового процесса попытка вывода приводит к приостановке. Такая ситуация возникает, например, если процессы запускаются из оболочки mc. В этом случае для продолжения работы процесса следует перевести соответствующее задание на передний план.