Добавить вывод в существующий файл
Чтобы добавить вывод в существующий файл и не разрушить его, вы можете воспользоваться символом >>:
command >> имя_файла<CR>
В результате выполнения команды вывод будет добавлен в конец существующего файла. Если файл не существует, то он будет создан. Например, рассмотрим как добавить вывод с помощью команды cat. Команда cat печатает содержимое файлов, имена которых являются ее аргументами, в стандартный вывод. Если нет аргументов, то она печатает стандартный ввод в стандартный вывод. Сначала выполните команду cat без перенаправления вывода. Затем содержимое файла trial2 добавляем после последней строки в файл trial1 при выполнении команды cat над файлом rtial2, перенаправив вывод в файл trial1:
$ cat trial1<CR>
This is the first line of trial1. Hello. This is the last line of trial1. $ $ cat trial2<CR>
This is the beginning of trial2. Hello. This is the end of trial2. $ cat trial2 >> trial1<CR>
$ cat trial1<CR>
This is the first line of trial1. Hello. This is the last line of trial1. This is the beginning of trial2. Hello. This is the end of trial2. $
Использование кавычек для отмены значения символа пробел
Кавычки аналогично обратной косой черте часто используются для отмены специального значения пробела. shell интерпретирует пробел в командной строке как разделитель между аргументами команды. Одиночные и двойные кавычки и обратная косая черта позволяют отменить это значение.
Например, чтобы в тексте разместить два или более слова, сделайте эти два слова одним аргументом, заключив их в кавычки. Чтобы найти два слова "The all" в файле trail, введите следующую команду:
$ grep 'The all' trail<CR>
The all * game $
Особенно полезно применение отмены специального значения пробела для функции banner, которая использует пробел как разделитель аргументов и печатает аргументы на отдельных строках.
Чтобы напечатать более одного аргумента на одной строке, заключите слова в двойные кавычки. Например, если вы введете:
banner happy birthday to you<CR>
то команда banner напечатает ваше сообщение на 4-х строках. Если вы введете:
banner happy birthday "to you"<CR>
то команда banner напечатает ваше сообщение на 3-х строках, причем слова "to" и "you" напечатает на одной строке.
Команда banner печатает сообщения на экране терминала большими плакатного размера буквами.
| |
Comments: info@citmgu.ru Designed by Andrey Novikov Copyright © CIT |
Использование команды nohup
Все процессы, за исключением at и batch, завершаются, когда вы выходите из системы. Если вы хотите, чтобы после вашего выхода из системы процесс в фоновом режиме продолжал выполняться, то вам необходимо использовать команду nohup. Команда nohup имеет следующий формат:
nohup command &<CR>
Предположим, вы хотите, чтобы команда grep осуществила поиск во всех файлах в вашем текущем справочнике строки "word" и перенаправила вывод в файл word.list, и затем, не ожидая завершения, вы хотите выйти из системы, то введите следующую строку:
nohup grep word * > word.list & <CR>
Вы можете завершить команду nohup с помощью команды kill.
| |
Comments: info@citmgu.ru Designed by Andrey Novikov Copyright © CIT |
Комбинирование фонового режима и перенаправления вывода
Когда команда запущена в фоновом режиме, то вывод ее печатается на экране терминала. И если вы используете терминал в то же время для выполнения других задач, то вывод фоновой задачи будет прерывать вашу работу. Однако, если перенаправить вывод в файл, то вы сможете спокойно работать.
Предположим, что вы хотите найти все появления слова "test" в файле schedule. Запустите команду grep в фоновом режиме и перенаправьте вывод в файл testfile:
$ grep test schedule > testfile<CR>
Теперь вы можете использовать терминал для других работ и просмотреть файл testfile позднее.
Метасимволы
В табл. 20 приведены метасимволы, используемые shell.
Таблица 20
Метасимволы
* ? [ ] | Эти метасимволы позволяют указывать сокращенные имена файлов при поиске по шаблону |
& | Означает, что команда будет выполняться в фоновом режиме |
; | Точка с запятой разделяет команды в командной строке |
\ | Отменяет специальное значение символов, таких как *, ?, [, ], &, ;, <, >, | |
'...' | Одиночные кавычки отменяют значение пробела как разделителя и специальное значение всех символов |
"..." | Двойные кавычки отменяют значение пробела как разделителя и специальное значение всех символов, за исключением $ и \ |
> | Перенаправляет вывод команды в файл |
< | Перенаправляет ввод для команды из файла |
>> | Перенаправляет вывод команды, который должен быть добавлен в конец существующего файла |
| | Создает канал, направляющий вывод одной команды во ввод другой команды |
`...` | Используется в паре; позволяет использовать вывод команды как аргументы в командной строке |
$ | Используется с позиционными параметрами и определенными пользователем пременными; также используется по умолчанию в качестве подсказки shell |
Метасимволы используются для поиска имен файлов, посредством их упрощается задача указания файлов или групп файлов как аргументов команды.
Некоторые применения перенаправления вывода
Перенаправление вывода очень удобно в том случае, если вы не хотите, чтобы вывод появлялся на экране немедленно, или хотите сохранить его. Рассмотрим две команды: spell и sort.
Команда spell
Команда spell сравнивает каждое слово в файле со своим словарем и печатает список всех потенциальных орфографических ошибок на экране. Если в словаре spell нет какого-либо слова (например, персональное имя), то она также выдает его как орфографическую ошибку. Если вы подадите на ввод spell большой файл, то его обработка займет много времени и список ошибок может быть очень большим. Команда spell распечатывает весь список ошибок сразу. Поэтому лучше всего перенаправить вывод spell в файл. Например, spell осуществляет поиск файла memo и помещает список орфографических ошибок в файл misspell:
$ spell memo > misspell<CR>
Команда sort
Команда sort размещает строки указанного файла в алфавитном или цифровом порядке. Прежде чем перенаправить вывод команды в файл убедитесь, что имя этого файла не существует. Команда sort сначала очищает файл, который будет содержать вывод, затем выполняет сортировку и помещает вывод в пустой файл.
Отмена специального значения (метасимвол \)
Символ \ позволяет вам отменить специальное значение следующего за ним символа. Например, у вас есть файл trail, который содержит следующий текст:
The all * game was held in Summit.
Чтобы найти символ звездочка (*) в файле, воспользуйтесь командой grep:
$ grep \* trail<CR>
The all * game $
команда grep найдет символ * в тексте и отобразит строку, в которой она появилась. Без символа \, символ звездочка будет интерпретироваться shell как метасимвол.
Отмена специального значения (метасимвол кавычки)
Отменить специальное значение символа вы также можете с помощью метасимвола кавычки. Одиночные кавычки ('...') отменяют специальное значение всех символов за исключением самих одиночных кавычек. Двойные кавычки ("...") отменяют специальное значение всех символов, за исключением символов двойные кавычки, $ и `(слабое ударение). Использование кавычек удобно для цифровых специальных символов.
Например, ваш файл trail содержит строку:
He really wondered why? Why???
Чтобы найти строку, содержащую три вопросительных знака, воспользуйтесь командой grep:
$ grep '???' trail<CR>
He really wondered why? Why??? $
Перенаправить ввод: знак <
Чтобы перенаправить ввод, укажите в командной строке после знака "меньше чем" (<) имя файла:
command < имя_файла<CR>
Перенаправить вывод: знак >
Чтобы перенаправить вывод, укажите в командной строке после знака "больше чем" (>) имя файла:
command > имя_файла<CR>
Примечание. Если вы перенаправите вывод в уже существующий файл, то вывод вашей команды заменит содержимое существующего файла.
Перед тем, как перенаправить вывод команды в конкретный файл убедитесь, что этот файл не существует. shell не предупреждает, что выполняет перезапись существующего файла.
Чтобы убедиться, что файл с запланированным именем не существует, воспользуйтесь командой ls с аргументом "имя_файла". Если этот файл не существует, то ls выдаст сообщение, что файл не найден в текущем справочнике. Например, проверка существования файлов temp и junk даст следующий результат:
$ ls temp<CR>
temp $ ls junk<CR>
junk: no such file or directiry $
Это означает, что вы можете назвать свой файл junk, но не можете использовать в качестве имени temp, если не хотите потерять содержимое существующего файла.
Перенаправление ввода и вывода
В системе UNIX некоторые команды ожидают ввод только с клавиатуры (стандартный ввод) и большинство команд отображают свой вывод на экране терминала (стандартный вывод). Однако система UNIX позволяет вам перенаправлять ввод и вывод в файлы и программы, т.е. вы можете сказать shell: взять ввод из файла, а не с клавиатуры; послать вывод в файл, а не на терминал; использовать программу как исходные данные для другой программы.
Перенаправление вывода команде
Символ | называется каналом. Канал является мощным средством, которое позволяет вам брать вывод одной команды и использовать его в качестве ввода для другой команды без создания временных файлов. Таким образом построенная последовательность команд называется конвейером. Общий формат конвейера:
command1 | command2 | command3 ... <CR>
Вывод command1 используется как ввод для command2. Вывод command2 используется как ввод для command3.
Чтобы понять насколько эффективен конвейер, рассмотрим 2 способа, которые дают одинаковый результат: использование метода перенаправления ввода/вывода. Запустим одну команду и перенаправим ее вывод во временный файл. Затем запустим вторую команду, которая берет содержимое временного файла как ввод. И в конце удалим временный файл; использование метода конвейера. Например, предположим вы хотите послать сообщение happy birthday с помощью команды banner владельцу david. Выполним сначала по первому методу:
Введите команду banner и перенаправьте ее вывод во временный файл:
banner happy birhday > message.tmp
Введите команду mail и в качестве ввода воспользуйтесь файлом message.tmp:
mail david < message.tmp
Удалите временный файл:
rm message.tmp
Вторым методом это можно сделать быстрее:
banner happy birthday | mail david<CR>
Подстановка вывода в качестве аргумента
Вывод большинства команд может использоваться как аргумент в командной строке. Для этого команду заключите между знаками "слабое ударение" (`...`) и поместите ее в командной строке в том месте, где вывод будет трактоваться как аргумент.
Например, вы можете подставить вывод конвейера команд date и cut в качестве аргумента в команде banner:
$ banner `date | cut -c12-19`<CR>
Обратите внимание на результат: система печатает banner с текущим временем.
| |
Comments: info@citmgu.ru Designed by Andrey Novikov Copyright © CIT |
Поиск одного набора (метасимвол [])
Если вы хотите, чтобы shell нашел любой символ из перечисленных вами символов, то заключите эти символы в квадратные скобки. Предположим, ваш справочник содержит следующие файлы: cat, fat, mat, rat. Если вы воспользуетесь в качестве части имени файла шаблоном [crf], то shell будет искать имена файлов, в которые входят либо буква "c", либо буква "r", либо буква "f" в указанной позиции. Пример:
$ ls [crf]at<CR>
cat fat rat $
Символы, которые могут быть сгруппированы в скобки, называются классом символов.
Скобки могут также использоваться для обозначения диапазона символов, цифр или букв. Предположим в вашем справочнике содержатся следующие файлы: chapter1, chapter2, chapter3, chapter4, chapter5, chapter6. Если вы укажете:
chapter[1-5]
то shell найдет файлы c chapter1 по chapter5.
Класс символов можно также указать с помощью диапазона букв. Если вы укажете [A-Z], то shell будет искать только большие буквы, если [a-z] - то малые буквы.
| |
Comments: info@citmgu.ru Designed by Andrey Novikov Copyright © CIT |
Поиск по одному символу (метасимвол ?)
Метасимвол ? осуществляет поиск любого одного символа в имени файла за исключением лидирующей точки. Предположим, вы имеете книгу, в которой 12 глав и хотите получить список глав до 9-ой главы. Если ваш справочник содержит следующие файлы:
Chapter1 Chapter2 Chapter5 Chapter9 Chapter11
то введите команду ls с метасимволом ? для получения всех глав, которые начинаются со строки "Chapter" и заканчиваются одним символом:
$ ls Chapter?<CR>
Chapter1 Chapter2 Chapter5 Chapter9 $
Хотя метасимвол осуществляет поиск одного символа, вы можете использовать его для поиска более одного символа в имени файла. Например, вы получите перечень всех остальных глав в текущем справочнике, если введете следующую команду:
ls Chapter??<CR>
И, конечно, чтобы получить список всех глав в текущем справочнике, используйте метасимвол *:
ls Chapter*<CR>
Поиск всех символов (метасимвол *)
Метасимвол * осуществляет поиск любой строки символов, включая нулевую (пустую) строку. Вы можете использовать * для обозначения полного или частичного имени файла. Просто символ * ищет все имена файлов и справочников в текущем справочнике, за исключением тех, которые начинаются с точки. Чтобы посмотреть метасимвол * в действии, введите его как аргумент в команде echo:
echo *<CR>
В ответ система распечатает перечень всех имен файлов в вашем текущем справочнике.
Символ * может представлять символы в любой части имени файла. Например, если вы знаете, что несколько файлов имеют одинаковые первые и последние буквы, то вы можете выдать запрос, основываясь на этом факте. Если в вашем справочнике находятся файлы FATE, FE, FADED_LINE, FIG3.4E, FINE_LINE, FAST_LINE, то для отображения всех этих файлов на экране введите команду:
ls F*E<CR>
Вы можете, например, с помощью метасимвола * найти все файлы с именами memo в системном справочнике: ls */memo
Получить состояние запущенного процесса
Команда ps дает вам состояние всех процессов, запущенных на данный момент. Например, вы можете использовать команду ps, чтобы просмотреть состояние всех процессов, которые запущены в фоновом режиме, применив символ &.
В следующем подпункте обсуждается вопрос, как применить номер PID (идентификатор процесса), чтобы остановить выполнение команды. PID является уникальным номером, который система UNIX назначает каждому активному процессу.
В следующем примере команда grep запускается в фоновом режиме и затем выдается команда ps. Система сообщает в ответ номер идентификации процесса (PID) и номер терминала (TTY). Она также выдает время выполнения каждого процесса (TIME) и имя команды, которая выполняется (COMMAND):
$ grep word * > temp <CR>
28223 $ $ ps<CR>
PID TTY TIME COMD 28124 tty10 0:00 sh 28223 tty10 0:04 grep 28224 tty10 0:04 ps $
Обратите внимание, что система распечатала номер PID для команды grep так же, как и для всех других запущенных процессов: для самой команды ps и команды sh, которая была запущена во время вашей регистрации.
Вы можете приостановить и вновь запустить программу, если в вашей системе предусмотрена функция управления заданиями. Команда jobs выдает список текущих фоновых процессов, запущенных или приостановленных. Команда jobs дополнительно к PID распечатывает идентификатор задания (JID) и имя задания. Чтобы вновь запустить приостановленное задание, либо возобновить фоновый процесс в оперативном режиме, вам необходимо знать JID. JID распечатывается на экране каждый раз, когда вы вводите команду запуска или останова процесса. Если вы введете:
jobs<CR>
то на экране появится следующая информация:
[JID] - Stopped (signal) <имя задания>
или
[JID] + Running <имя задания>
Последовательное выполнение команд (символ ;)
В одной командной строке вы можете указать несколько команд. Эти команды должны быть разделены символом ; (точка с запятой) или символом & (амперсанд):
command1; command2; command3<CR>
Система UNIX выполняет команды в том порядке, в котором они стоят в командной строке, и печатает вывод этих команд в том же порядке. Этот процесс называется последовательным выполнением.
Например, введите:
cd; pwd; ls<CR>
shell выполнит эти команды последовательно:
cd изменит ваше местоположение, переместив вас в регистрационный справочник; pwd распечатает полное имя пути вашего текущего справочника; ls перечислит файлы в вашем текущем справочнике.
Shell - интерпретатор командного языка
В этом разделе описаны команды и символы, имеющие специальное значение, которые позволяют: находить с помощью шаблона и манипулировать группами файлов; запускать команду в фоновом режиме или в определенное время; выполнять последовательно группу команд; перенаправлять стандартный ввод и вывод; завершать работающие программы.
Специальные символы
shell имеет также и другие символы, которые выполняют различные полезные функции.
Выполнение, останов и повторный запуск процессов
В этом подразделе описывается: как запустить команду в определенное время с помощью команд batch и at; как получить информацию о состоянии процесса; как завершить активный процесс; как вновь запустить остановленный процесс; как пренести процесс из оперативного в фоновый режим и наоборот.
Запуск команд в заданное время
Команды batch и at позволяют вам определять время запуска команды или последовательности команд. При помощи команды batch система определяет время запуска команды, вы это можете определить с помощью команды at. Обе команды ожидают ввод со стандартного ввода (терминала); список команд, вводимых с терминала, должен завершаться нажатием клавиши ^d (одновременное нажатие клавиши Ctrl и клавиши d).
Команда batch очень полезна, если вы запускаете процесс или программу, которые занимают много системного времени. Команда batch представляет системе задание (содержащее последовательность команд для выполнения). Задание ставится в очередь и запускается как только у системы появляется возможность. Это позволяет системе быстро отвечать на запросы других пользователей. Общий формат команды batch:
batch<CR>
первая команда<CR>
. . . последняя команда<CR>
<^d>
Если запускается только одна команда, то ее можно ввести в одной командной строке:
batch command_line<CR>
В следующем примере batch используется для выполнения команды grep в согласованное время. Команда grep осуществляет поиск всех файлов в текущем справочнике и перенаправляет вывод в файл dol.file.
$ batch<CR>
grep dollar * > dol.file<CR>
<^d>
job 155223141.b at Sun Dec 11:14:54 1989 $
После того как вы зададите задание batch, система выдаст ответ, в котором даны номер задания, дата и время. Номер задания не то же самое, что номер процесса, который система генерирует, когда вы запускаете команду в фоновом режиме.
Команда at позволяет вам указывать точное время выполнения команд. Общий фомат команды at:
at time<CR>
первая команда<CR>
. . . последняя команда<CR>
<^d>
Аргумент time состоит из времени дня и даты, если дата не сегодняшняя.
В следующем примере показано, как использовать команду at для посылки сообщения happy birthday пользователю с регистрационным именем emily:
$ at 8:15am Feb 27<CR>
banner happy birthday | mail emily<CR>
<^d>
$
Обратите внимание, что команда at подобно команде batch выдает ответ с номером задания, датой и временем.
Если вы не хотите, чтобы команды, находящиеся в данный момент в очереди заданий batch или at были выполнены, то можете удалить их из очереди. Для этого воспользуйтесь опцией -r в команде at, указав ее с номером задания. Общий формат такой команды:
at -r jobnumber<CR>
Например, чтобы удалить предыдущее задание at, введите:
at -r 453400603.a<CR>
Если вы забыли номер задания, то команда :
at -l
распечатает вам список текущих заданий в очереди batch или at, как показано на следующем экране:
$ at -l<CR>CW user mylogin 168302040.a at Sat Nov 25 13:00:00 1989 user mylogin 453400603.a at Fri Feb 24 08:15:00 1989 $
Таким образом команда at выполняет команды в указанное время. Вы можете использовать от одной до 4-х цифр и буквосочетания "am" и "pm", чтобы указать время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание должно быть выполнено сегодня, то дату вводить не надо.
Пример.
at 08:15am Feb 27 at 5:14pm Sept 24
Запуск команды в фоновом режиме (символ &)
Некоторые команды shell занимают много времени при выполнении. Эти команды можно запустить в фоновом режиме с использованием &, освобождая тем самым терминал для других задач. Общий формат для запуска команд в фоновом режиме следующий:
command &<CR>
Примечание. Интерактивные команды shell (например, read) нельзя запускать в фоновом режиме.
Когда вы запускаете команду в фоновом режиме, то система UNIX выводит номер процесса. Вы можете использовать этот номер для завершения выполняющейся в фоновом режиме команды. Появившаяся подсказка означает, что терминал свободен и ожидает вашу команду.
Запустить команду в фоновом режиме вы можете только в том случае, если ваш терминал предоставляет вам такую возможность.
Запуск остановленного задания
Если функция управления заданиями активна, то вы можете вновь запустить приостановленный процесс. Чтобы вновь запустить процесс, остановленный командой stop, вы сначала должны определить JID с помощью команды jobs. Затем вы можете использовать JID со следующими командами:
fg <JID> - возобновляет приостановленное задание или переводит задание из фонового режима в оперативный; bg <JID> - вновь запускает приостановленное задание в фоновом режиме.
Завершение активных процессов
Команда kill завершает активные процессы в фоновом режиме и команда stop приостанавливает временно процессы. Общий формат этих команд:
kill PID<CR>
или
stop JID<CR>
Обратите внимание, что вы не можете завершать фоновые задания нажатием клавиш BREAK или DEL. Следующий пример показывает, как вы можете завершить команду grep, которая выполняется в фоновом режиме.
Пример.
$ kill 28223<CR>
28223 Terminated $
После того как система выдаст ответ на запрос, на экране появится подсказка $, означающая, что процесс завершен. Если система не найдет указанный PID, то появится сообщение об ошибке:
kill:28223:No such process
Чтобы приостановить оперативный процесс (если активна функция управления заданиями), введите:
ctrl Z
На экране появится следующее сообщение:
<JID> Stopped(user) <имя задания>
Безусловная передача управления
Команда break безусловно останавливает выполнение любого цикла, в котором он встречается и передает управление команде, следующей после ключевых слов done, fi или esac.
В предыдущем примере программы set.term вы можете использовать команду break, вместо echo, чтобы выйти из программы, как приведено в следующем примере:
Пример.
$ cat set.term<CR>
echo If you have a TTY 4420 type in 4420 echo If you have a TTY 5410 type in 5410 echo If you have a TTY 5420 type in 5420 read term case term in 4420) TERM-T4 ;; 5410) TERM-T5 ;; 5420) TERM-T7 ;; *) break ;; esac export TERM echo end of programm $
Команда continue приведет к тому, что программа немедленно перейдет к следующей итерации цикла while или for без выполнения остальных команд в цикле.
| |
Comments: info@citmgu.ru Designed by Andrey Novikov Copyright © CIT |
Циклы
Операторы цикла for и while позволяют выполнить команду или последовательность команд несколько раз.
Добавление команд в файл .profile
Отредактируем файл и добавим следующую команду echo последней строкой в файл:
echo Good Morning! I am ready to work for you.
Если вы сделали какие-либо изменения в файле .profile и хотите использовать его в текущей сессии, то вы можете выполнить команды непосредственно с использованием команды shell точка (.). shell вновь проинициализирует конфигурацию, прочитав выполненные команды в файле .profile. Попытайтесь сделать это, введите:
. .profile<CR>
Система ответит:
Good Morning! I am ready to work for you. $
"Here document"
"Here document" позволяет размещать в shell программе строки, которые перенаправляются в качестве ввода команды в этой программе. Это один из способов обеспечения ввода для команды в shell программе без использования отдельного файла. Запись состоит из символа перенаправления << и разделителя, который указывает начало и конец строк ввода. В качестве разделителя может использоваться один символ или строка символов. Чаще всего это знак !.
Формат команды следующий:
command<<delimiter<CR>
...input lines...<CR>
delimiter<CR>
Именованные переменные
В shell программе вы можете использовать именованные переменные. Значение именованной переменной вы присваиваете сами следующим образом:
name_variable=value<CR>
Обратите внимание, что ни слева ни справа от знака равенства нет пробелов.
В следующем примере var1 - это имя переменной, а myname - значение строки символов, которое присваивается переменной:
Пример.
var1=myname<CR>
Знак $ используется перед именем переменной в shell программе для ссылки на значение этой переменной. Если взять предыдущий пример, то ссылка $var1 говорит shell, что нужно заменить на значение myname любую встретившуюся строку символов $var1.
Первый символ имени переменной должен быть буквой или символом подчеркивания. Имя переменной может состоять из букв, символов подчеркивания и цифр. Имена переменных не должны совпадать с именами shell команд. Также shell зарезервировано несколько имен переменных, которые вы не должны использовать для своих переменных. Ниже дано краткое описание этих зарезервированных имен переменных:
CDPATH - определяет путь поиска команды;
HOME - значение, используемое по умолчанию командой cd (собственный справочник);
IFS - определяет разделитель (обычно пробел, табуляция и возврат каретки);
LOGNAME - ваше регистрационное имя;
MAIL - имена файлов, которые содержат электронную почту;
PATH - определяет имя пути, используемое shell для нахождения команд;
PS1 - определяет первичную подсказку (по умолчанию $);
PS2 - определяет вторичную подсказку (по умолчанию >);
TERM - идентифицирует тип терминала. Значение этой переменной важно при работе с редактором vi;
TERMINFO - идентифицирует справочник, в котором находится информация о вашем терминале;
TZ - определяет зону времени (по умолчанию EST5EDT).
Значение этих переменных вы можете определить двумя способами. Первый, вы можете ввести:
echo $variable_name
Система распечатает значение переменной variable_name. Второй способ: вы можете воспользоваться командой env для распечатки значений всех определенных переменных в shell. Для этого введите команду env и система выдаст список всех имен переменных и их значения.
Использование /dev/null
Файловая система имеет файл /dev/null, где вы можете хранить нежелательный вывод. Например, если просто ввести команду who, то система ответит, кто работает в системе. Если вы перенаправите вывод этой команды в /dev/null:
who > /dev/null
то не получите ответа.
Использование ed в shell программе
"Here document" предлагает способ использования ed в shell программе. Предположим вы хотите создать shell программу, которая будет вызывать редактор ed, проводить глобальные изменения в файле, записывать изменения в файл и затем завершать работу с ed. На следующем экране приведено содержание программы ch.text, которая выполняет эти задачи:
$ cat ch.text<CR>
echo Type in the filename read file1 echo Type in the exact text to be changed. read old_text echo Type in the exact new text to replace the above. read new_text ed - $file1 <<! g/$old_text/s//$new_text/g w q ! $
Обратите внимание на знак - (минус) в команде ed. Эта опция предотвращает распечатку счетчика символов на экране. Обратите также внимание на формат команды ed для глобальной замены:
g/$old_text/s//$new_text/g
Программа использует 3 переменные: file1, old_text, new_text. При запуске эта программа использует команду read для получения значений этих переменных. Эти переменные содержат следующую информацию:
file - имя файла, который будет редактироваться;
old_text - текст, который будет изменен;
new_text - новый текст.
Переменные вводятся в программу, here document перенаправляет команду глобальной замены, команду записи и команду завершения команде ed. Запустите программу ch.text. Получите следующий экран:
$ ch.text<CR>
Type in the filename memo<CR>
Type in the exact text to be changed. Dear John:<CR>
Type in the exact new text to replace the above. To what it may concern:<CR>
$ cat memo<CR>
To what it may concern:<CR>
$
Использование команды read
Общий формат команды read:
read variable<CR>
Значение, присвоенное командой read переменной variable, будет заменять $variable где бы она не встречалась в программе пользователя. Если программа выполняет команду echo до команды read, то она сможет отобразить только:
Type in ...
Команда read будет ждать до тех пор, пока вы не введете строку символов и нажмете клавишу <CR>, тем самым присваивая строку переменной.
Следующий пример покажет вам, как написать простую shell программу num.please, содержащую телефонные номера. Эта программа использует следующие команды:
echo - выдает подсказку для ввода фамилий клиентов;
read - присваивает вводимое значение переменной;
grep - просматривает файл list в поисках этой переменной.
Программа будет выглядеть следующим образом:
Пример.
$ cat num.please<CR>
echo Type in the list name: read name grep $name home/list $
Создайте файл list, содержащий несколько фамилий и номеров телефонов. И теперь запустите файл num.please.
В следующем примере приводится текст программы mknum, которая создает список. В программе mknum используется следующая последовательность команд:
echo - выдает подсказку для ввода имени клиента;
read - присваивает имя клиента переменной name;
echo - выдает подсказку для ввода номера телефона;
read - присваивает номер телефона переменной num;
echo - добавляет значение переменных name и num в файл list;
Если вы хотите, чтобы вывод команды echo добавлялся в конец списка, то вы должны использовать >>. Если вы будете использовать >, то список будет состоять из последего номера телефона, который вы добавили.
С помощью команды cat отобразите содержание программы mknum:
Пример.
$ cat mknum<CR>
echo Type in name read name echo Type in number read num echo $name $num >> list $ chmod u+x mknum<CR>
$
Использование shell переменных
Несколько переменных, зарезервированных shell, используются в файле .profile.
Рассмотрим 4 основные переменные:
HOME - эта переменная дает имя пути вашего регистрационного справочника. С помощью команды cd перейдите в него и введите:
pwd<CR>
Теперь введите:
echo $HOME<CR>
$HOME - это аргумент, используемый командой cd. Если вы не указывали справочник, то cd переместит вас в $HOME; PATH - эта переменная дает путь поиска для обнаружения и выполнения команд. Чтобы посмотреть текущее значение переменной PATH, введите:
echo $PATH<CR>
Система распечатает текущее значение PATH:
$ echo $PATH<CR>
:/mylogin/bin:/bin:/usr/bin $
Двоеточие (:) является разделителем между именами путей в строке, присваиваемой переменной $PATH. Если перед двоеточием ничего не указано, то подразумевается текущий справочник.
Если вы хотите установить специальный справочник для shell программ с именем :/project/bin, добавьте его следующим образом:
PATH="$PATH:/project/bin"<CR>
TERM - эта переменная сообщает shell тип терминала. Чтобы присвоить этой переменной значение, вы должны выполнить 3 команды в следующем порядке:
TERM=terminal_name<CR>
export TERM<CR>
tput init
Первые две строки совместно сообщают компьютеру тип терминала, который вы используете. Последняя строка сообщает терминалу, что компьютер находится в состоянии ожидания для связи с терминалом, тип которого указан в переменной TERM.
Если вы хотите, чтобы эти команды выполнялись автоматически при каждой вашей регистрации, то включите их в файл .profile; PS1 - эта переменная устанавливает первичную подсказку shell (по умолчанию это знак $). Изменить подсказку вы можете, изменив значение переменной PS1 в файле .profile.
| |
Comments: info@citmgu.ru Designed by Andrey Novikov Copyright © CIT |
Коды завершения
Большинство команд shell возвращает коды, которые указывают, успешно ли завершилась команда. Если возвращаемое значение 0(ноль), то команда выполнилась успешно. Коды возврата не печатаются автоматически, но их можно получить как значение специального параметра shell $?.
в программе разместить комментарии, воспользуйтесь
Чтобы в программе разместить комментарии, воспользуйтесь знаком #. Если знак # стоит после команды, то сама команда выполняется, а комментарий игнорируется. Формат строки комментария:
#comment<CR>
Конструкции языка программирования shell
Язык программирования shell имеет несколько конструкций, которые придадут гибкость вашим программам: комметнарии позволят описывать функции программы; "here document" позволяет вам включать в shell программы строки, которые будут перенаправляться как ввод в некоторые команды shell программы; команда exit позволяет завершать программу в нужной точке и использовать коды возврата; конструкции цикла for, while позволяют повторять группу команд в цикле; условные команды if и case выполняют группу команд, если выполнилось некоторое условие; команда break позволяет выполнить безусловный выход из цикла.
Модификация окружения
Система UNIX позволяет вам модифицировать конфигурацию, определяемую при вашей регистрации.
Когда вы регистрируетесь в системе, shell вначале проверяет файл .profile в вашем регистрационном справочнике. Этот файл содержит команды, которые управляют вашей конфигурацией. Этот файл может быть изменен в соответствии с вашими потребностями. Чтобы проверить, существует ли в вашем собственном справочнике файл .profile, введите:
ls -al $HOME
При редактировании файла .profile будьте очень внимательны. Прежде чем выполнить какие-либо изменения в файле .profile сделайте копию этого файла, например с именем safe.profile. Введите:
cp .profile safe.profile<CR>
Ограничения при именовании программ shell
shell программе вы можете дать любое имя, не совпадающее с именами системных команд. Если имя вашей программы совпадает с именем команды системы, то система будет выполнять вашу команду вместо системной.
| |
Comments: info@citmgu.ru Designed by Andrey Novikov Copyright © CIT |
Оператор for
Оператор for выполняет последовательность команд для каждого элемента списка. Он имеет формат:
for variable<CR>
in a_list_of_values<CR>
do<CR>
command_1<CR>
command_2<CR>
. . . last command<CR>
done<CR>
Для каждой итерации цикла следующий элемент списка присваивается переменной, данной в операторе for. Ссылка на эту переменную может быть сделана в любом месте в командах внутри оператора do. При конструировании каждой секции команд вам необходимо убедиться, что каждому do соответствует done в конце цикла.
Переменная может иметь любое имя. Например, если ваша переменная названа var, то ссылка в списке команд на $var сделает значение доступным. Если оператор in опущен, то значением для var будет набор аргументов, заданный в команде и доступный в специальном параметре $*. Список команд между ключевым словом do и done будет выполнен для каждого значения.
Когда команды будут выполнены для последнего элемента списка, программа будет выполнять строку ниже done.
Оператор while
Оператор цикла while использует 2 группы команд. Он будет выполнять последовательность команд во второй группе (список do ... done) до тех пор пока последняя команда в первой группе (список while) возвращает состояние "истина", означающее, что выражение после do может быть выполнено.
Общий формат оператора цикла while:
while<CR>
command_1<CR>
. . . last command<CR>
do<CR>
command_1<CR>
. . . last command<CR>
done<CR>
Например, программа enter.name использует цикл while для ввода списка имен в файл. Программа состоит из следующих командных строк:
$ cat enter.name<CR>
while read x do echo $x>>xfile done $
Внеся некоторые добавления, получим следующую программу:
$ cat enter.name<CR>
echo Please type in each person's name and than a <CR>
echo Please end the list of names with a <^d>
while read x do echo $x>>xfile done echo xfile contains the following names: cat xfile $
Обратите внимание, что после завершения цикла программа выполняет команды ниже done.
В первых двух командах echo используются специальные символы, так что вы должны воспользоваться кавычками для отмены специального значения. На следующем экране приведены результаты выполнения программы enter.name:
$ enter.name<CR>
Please type in each person's name and than a <CR>
Please end the list of names with a <^d>
Mary Lou<CR>
Janice<CR>
<^d>
xfile contains the following names: Mary Lou Janice $
После того, как цикл завершится, программа распечатает все имена, содержащиеся в xfile.
Отладка программы
Для нахождения и корректировки ошибок вам могут понадобиться две опции команды sh:
sh -v shellprogramname
печатает вводимые shell строки, как если бы они были прочитаны системой; sh -x shellprogramname
печатает команды и их аргументы по мере их выполнения.
Для примера создадим shell программу, которая содержит ошибку:
$ cat bug<CR>
today=`date` echo enter person read person mail $1 $person When you log off once into my office olease. $today MLH $
Обратите внимание, что today равно выводу команды date, которая заключена между знаками слабого ударения.
При выполнении программы bug, чтобы завершить программу, вы должны нажать клавишу BREAK или DELETE.
Чтобы отладить эту программу, попытайтесь выполнить ее с использованием sh -v. Будут напечатаны строки файла, как если бы они были прочитаны системой:
$ sh -v bug tom<CR>
today=`date` echo enter person enter person read person tom mail $1
Обратите внимание, что вывод остановился на команде mail, т.к. здесь обнаружена ошибка. Вы должны использовать here document, чтобы перенаправить ввод в mail.
Откорректированная программа bug будет выглядеть следующим образом:
$ cat bug<CR>
today=`date` echo enter person read person mail $1 <<! $person When you log off once into my office olease. $today MLH ! $
Команда tee полезна при отладке конвейеров. В то время как стандартный ввод команда направляет в стандартный вывод, она сохраняет копию этого ввода в файл, имя которого дано как аргумент.
Общий формат команды tee:
command1 | tee saverfile | command2<CR>
где saverfile - это файл, который сохраняет вывод команды для анализа.
Предположим, вы хотите проверить вывод команды grep в следующей командной строке:
who | grep $1 | cut -c1-9<CR>
Вы можете воспользоваться командой tee, чтобы скопировать вывод команды grep в файл check не разрушая остальной конвейер:
who | grep $1 | tee check | cut -c1-9<CR>
Файл check содержит копию вывода grep, как показано на следующем экране:
$ who | grep mike | tee check | cut -c1-9<CR>
mike $ cat check mike tty61 Apr 10 10:30 $
Переменные
shell программы манипулируют с переменными. В этом пункте обсуждаются три типа переменных: позиционные параметры; специальные параметры; именованные переменные.
Перенаправление вывода команды в переменную
Формат команды следующий:
variable=command<CR>
Вывод команды становится значением переменной. Пример shell программы t, распечатывающей время:
$ cat t<CR>
time=`date | cut -c12-19` echo The time is: $time $
Сделайте файл исполняемым и получите программу, которая выдает время:
$ chmod u+x t<CR>
$ t<CR>
The time is: 10:30 $
Позиционные параметры
Позиционные параметры являются переменными в shell программе. Их значение устанавливается из аргументов, указанных в командной строке, которая вызывает программу. Позиционные параметры нумеруются и на них ссылка идет с помощью символа $: $1, $2, $3 и т.д.
shell программа может использовать до 9 позиционных параметров. Если shell программа вызывается с помощью командной строки, подобной следующей:
shell.prog pp1 pp2 pp3 pp4 pp5 pp6 pp7 pp8 pp9 <CR>
то позиционному параметру $1 в программе присваивается значение pp1, $2 - значение pp2 и т.д. во время вызова программы. Чтобы практически рассмотреть это замещение позиционных параметров, создайте файл pp. Затем введите команды echo в файл pp. В результате выполнения команды cat получим следующий вывод:
$ cat pp<CR>
echo The first positional parameter is: $1<CR>
echo The second positional parameter is: $2<CR>
echo The third positional parameter is: $3<CR>
echo The fourth positional parameter is: $4<CR>
$
Если вы выполните эту shell программу с аргументами one, two, three, four, то получите результат (но вначале нужно сделать shell программу pp исполняемой с помощью команды chmod):
$ chmod u+x pp<CR>
$ $ pp one two three four<CR>
echo The first positional parameter is: one echo The second positional parameter is: two echo The third positional parameter is: three echo The fourth positional parameter is: four $
Команда who перечисляет всех пользователей, в данный момент зарегистрированных в системе. Можем создать простую программу whoson, которая будет сообщать, работает ли в настоящий момент конкретный пользователь. Введем в файл whoson командную строку:
who | grep $1<CR>
Команда who перечисляет всех текущих пользователей системы, а команда grep осуществляет поиск строки, содержащей значение, соответствующее позиционному параметру $1. Теперь подставим конкретное имя в качестве аргумента в файле whoson, например, sue. Когда вы зададите команду "whoson sue", shell программа заменит $1 на sue в вашей программе и выполнит ее в следующем виде:
who | grep sue<CR>
Вывод будет следующим:
$ whoson sue<CR>
sue tty26 Jan 24 13:35 $
Если указанный пользователь sue не зарегистрирован в данный момент в системе, grep завершится неудачно и whoson не будет ничего выводить на экран.
shell позволяет указывать в командной строке до 128 аргументов, но ссылаться можно не более, чем на 9 позиционных параметров. В следующем пункте описан специальный параметр $*.
Присвоение позиционного параметра переменной
Вы можете присвоить позиционный параметр именованному параметру следующим образом:
var1=$1<CR>
В следующем примере приведена программа simp.p, которая присваивает позиционнный параметр переменной:
Пример.
$ cat simp.p<CR>
var1=$1 echo $var1 $
Также вы можете присвоить переменной вывод команды, которая использует позиционные параметры:
person=`who | grep $1`<CR>
| |
Comments: info@citmgu.ru Designed by Andrey Novikov Copyright © CIT |
Присвоение значений переменным
Если вы редактируете с помощью редактора vi, то знаете, что можно установить значения переменной TERM вводом следующей командной строки:
TERM=terminal_name<CR>
export TERM
Это простейший способ присвоения значения переменной. Существует еще несколько способов присвоения: использование команды read для присвоения ввода переменной; перенаправление вывода команды в переменную с использованием команды замены со знаками слабого ударения (`...`); присвоение позиционного параметра переменной.
Проверка кодов завершения
После выполнения в интерактивном режиме команды, вы можете увидеть код завершения при вводе:
echo $?
Рассмотрим следующий пример:
$ cat hi This is file hi. $ echo $? 0 $ cat hello cat: cannot open hello $ echo $? 2 $
В первом случае файл hi существует в вашем справочнике и вы имеете разрешение на чтение. С помощью команды cat вы можете распечатать содержимое файла. Результат команды cat: код возврата 0, который вы получите, задав параметр $?. Во втором случае файл либо не существует, либо вы не имеете право на чтение. Команда cat печатает диагностическое сообщение и возвращает код 2.
shell программа нормально завершается, когда выполнится последняя команда в файле. Однако вы можете использовать команду exit для завершения программы. Более важно то, что вы можете использовать команду exit для получения кодов возврата shell программы.
Создание простых программ shell
Начнем описание создания простых программ shell, которые выполняют задачи: печать текущего справочника; список содержимого этого справочника; отображение следующих сообщений на вашем терминале:
"This is the end of the shell program."
С помощью редактора создайте файл dl и введите в него строки:
pwd<CR>
ls<CR>
echo This is the end of the shell program.<CR>
Теперь вы имеете программу shell. Вы можете с помощью cat отобразить содержимое файла:
$ cat dl<CR>
pwd ls echo This is the end of the shell program. $
Создание справочника bin для исполняемых файлов
Чтобы сделать shell программы доступными изо всех ваших справочников, вы можете создать справочник bin в своем регистрационном справочнике и переписать shell программы в этот справочник.
С помощью переменной PATH вы можете включить ваш справочник bin:
PATH = $PATH:$HOME/bin
Специальные параметры
Когда вы обращаетесь к программе shell, специальный параметр $# содержит число аргументов, с которыми shell программа была вызвана. Это значение может использоваться в любом месте shell программы.
Например, создайте командную строку в файле get.num, сделайте файл исполняемым и запустите команду cat:
$ cat get.num<CR>
echo The number of arguments is: $# $
Программа просто отобразит число аргументов, с которыми она была вызвана.
Когда вы обращаететсь к shell программе специальный параметр $* содержит строку со всеми аргументами, с которыми программа была вызвана.
Средства программирования shell
Вы можете использовать shell для создания программ. Такие программы называются также процедурами shell. В этом разделе рассказывается как создавать и выполнять программы shell с помощью команд, переменных, позиционных параметров, кодов возврата.
Прежде чем создавать программы shell необходимо изучить редактор.
Условные операторы
Оператор if ... then
Команда if говорит shell программе, что нужно выполнить последовательность команд после then, если последняя команда в списке команд конструкции if выполнилась успешно. Конструкции if заканчиваются ключевым словом fi.
Общий формат конструкции if:
if<CR>
command_1<CR>
. . . last command<CR>
then<CR>
command_1<CR>
. . . last command<CR>
fi<CR>
Например, shell программа search демонстрирует применение конструкции if ... then. Программа search использует команду grep для поиска слова в файле. Если grep выполнилась успешно, то программа отображает найденное слово. Экран будет выглядеть следующим образом:
$ cat search<CR>
echo Type in the word and the file name. read word file if grep $word $file then echo $word is in $file fi $
Эта программа отображает вывод команды grep. Если вы хотите сохранить ответ системы на команду grep в вашей программе, то воспользуйтесь файлом /dev/null, изменив командную строку if на следующую:
if grep $word $file > /dev/null<CR>
Теперь выполните команду search. Она ответит только сообщением, указанным после команды echo.
Конструкция if ... then ... else может исполнять альтернативный набор команд, стоящий после else, в случае, если последовательность if является ложью. Формат этой конструкции следующий:
if<CR>
command_1<CR>
. . . last command<CR>
.linthen<CR>
command_1<CR>
. . . last command<CR>
else<CR>
command_1<CR>
. . . last command<CR>
fi<CR>
С помощью этой конструкции вы можете усовершенствовать программу search, так что она будет сообщать вам и найденное слово и то, что слово не найдено. В этом случае программа search будет выглядеть следующим образом:
$ cat search<CR>
echo Type in the word and the file name. read word file if grep $word $file > /dev/null then echo $word is in $file else echo $word is NOT in $file fi $
Команда test
Команда test используется для организации цикла. Она проверяет на истинность определенные условия и полезна для организации условных конструкций. Если условие истинно, то цикл будет продолжен. Если условие ложно, то цикл завершится и будет выполняться следующая команда. Некоторые примеры использования команды test:
test -r file<CR> истина, если файл существует и доступен для чтения; test -w file<CR> истина, если файл существует и доступен для записи; test -x file<CR> истина, если файл существует и является выполняемым; test -s file<CR> истина, если файл существует и имеет как минимум один символ; test var1 -eq var2<CR> истина, если var1 равно var2; test var1 -ne var2<CR> истина, если var1 не равно var2.
Пример. Создадим shell программу, которая перемещает все исполняемые файлы из текущего справочника в ваш справочник bin. Для этого воспользуемся командой test -x для выбора исполняемых файлов. Программа mv.file будет выглядеть следующим образом:
$ cat mv.file<CR>
echo type in the directory path read path for file do if test -x $file then mv $file $path/$file fi done $
Конструкция case ... esac позволяет выбрать вам один из несколько шаблонов и затем выполнить список команд для этого шаблона. Выражение-шаблон должно начинаться с ключевого слова in, а правая круглая скобка должна быть помещена после последнего символа каждого шаблона. Последовательность команд для каждого шаблона заканчивается двумя знаками ;;. Конструкция case должна быть закончена ключевым словом esac.
Общий формат конструкции case:
case word<CR>
in<CR>
pattern1)<CR>
command line 1<CR>
. . . last command line<CR>
;;<CR>
pattern2)<CR>
command line 1<CR>
. . last command line<CR>
;;<CR>
pattern3)<CR>
command line 1<CR>
. . last command line<CR>
;;<CR>
*)<CR>
command line 1<CR>
. . last command line<CR>
;;<CR>
esac<CR>
Конструкция case пытается найти word с шаблоном pattern в первой секции шаблонов. Если поиск удачен, то программа выполняет командные строки после первого шаблона до соответствующих знаков ;;.
Если первый шаблон не найден, то осуществляется переход ко второму шаблону. Если любой шаблон найден, то программа не рассматривает остальные шаблоны, а переходит к команде, следующей за esac. Знак * используется как шаблон для поиска любого word и таким образом дает вам набор команд, который будет выполнен, если никакой другой шаблон не будет найден. Поэтому шаблон звездочка (*) размещается как последний шаблон в конструкции case, чтобы другие шаблоны были проверены первыми. Это поможет вам обнаружить некорректный и неожиданный ввод.
В шаблонах могут использоваться метасимволы *, ?, []. Это обеспечивает гибкость программ.
Рассмотрим пример. Программа set.term устанавливает переменную TERM в соответствии с типом терминала, который вы используете. Применяется следующая командная строка:
TERM=terminal_name<CR>
Шаблон * стоит последним в списке шаблонов. Он выдает предупреждающее сообщение, что для указанного типа терминала нет соответствующего шаблона и позволяет вам завершить конструкцию case.
Пример.
$ cat set.term<CR>
echo If you have a TTY 4420 type in 4420 echo If you have a TTY 5410 type in 5410 echo If you have a TTY 5420 type in 5420 read term case term in 4420) TERM-T4 ;; 5410) TERM-T5 ;; 5420) TERM-T7 ;; *) echo not a correcr terminal type ;; esac export TERM echo end of programm $
Установка характеристик терминала
Команда stty может сделать вашу конфигурацию более удобной. Вы можете воспользоваться этой командой с опциями -tabs и echoe.
stty -tabs - эта опция сохраняет символы табуляции при печати. Она устанавливает табуляцию более, чем на 8 пробелов (это значение установлено по умолчанию). Количество пробелов для каждой табуляции может быть разным; stty echoe - эта опция стирает символы с экрана аналогично тому, как это делаете с помощью BACKSPACE.
Вы можете включить эти команды stty в файл .profile. Если вы воспользуетесь командой tail, которая отображает несколько последних строк файла, то вы можете увидеть результат добавления этих трех командных строк в файл .profile:
$ tail -3 .profile<CR>
echo Good Morning! I am ready to work for you. stty -tabs stty echoe $
| |
Comments: info@citmgu.ru Designed by Andrey Novikov Copyright © CIT |
Выполнение программ shell
Выполнить shell программу вы можете с помощью команды sh. Введите:
sh dl<CR>
Когда команда dl выполняется с помощью sh, то вначале печатается имя пути текущего справочника, потом список файлов в текущем справочнике и в конце комментарий: "This is the end of the shell program."
С помощью команды chmod вы можете сделать файл исполняемым:
$ chmod u+x dl<CR>
$ ls -l<CR>
total 2 -xw------ 1 login login 3661 Nov 2 10:28 mbox -xwx----- 1 login login 48 Nov 15 10:50 dl $
Обратите внимание, что chmod включает разрешение на выполнение (+x) для пользователя (u). Теперь dl является исполняемой программой. Попытайтесь выполнить ее. Введите:
dl<CR>