А.П. Строляров, И.Г. Головин, И.А. Волкова - Операционная система Unix (1114677), страница 5
Текст из файла (страница 5)
Например, команда24I=$(( $I + 7 ))увеличит значение переменной I на семь.С помощью встроенной в интерпретатор Bourne Shell команды testможно осуществлять проверку выполнения различных условий. Еслизаданное условие выполнено, команда завершится с нулевым (успешным) кодом возврата, в противном случае – с единичным (неуспешным).Синонимом команды test является символ открывающей квадратнойскобки, причем сама команда в этом случае воспрнимает символ закрывающей квадратной скобки в качестве своего параметра (как знакокончания выражения), что позволяет наглядно записывать проверяемое выражение, заключая его в квадратные скобки. Приведём несколько примеров.[ -f "file.txt" ]# существует ли файл с именем file.txt[ "$I" -lt 25 ]# значение переменной I меньше 25[ "$A" = "abc" ]# значение переменной A является строкой abc[ "$A" != "abc" ]# значение переменной A не является строкой abcЭто можно, например, использовать в операторе ветвления:if [ -f "file.txt" ]; thencat "file.txt"elseecho "Файл file.txt не найден"fiЗаметим, что то же самое можно было написать и иначе, без использования квадратных скобок, но это менее наглядно:if test -f "file.txt" ; thencat "file.txt"elseecho "Файл file.txt не найден"fiВ качестве команды, проверяющей условие, может фигурировать нетолько test, но и любая другая команда.
Например:25if gcc -Wall -g myprog.c -o myprog; thenecho "Компиляция прошла успешно"elseecho "При компиляции произошла ошибка"fiКроме оператора ветвления, язык Bourne Shell поддерживает и болеесложные конструкции, в том числе циклы. Например, следующий фрагмент напечатает все числа от 1 до 100:I=0while [ $I -le 101 ]; doecho $II=$(( $I + 1 ))doneИспользовать информацию об успешности выполнения командыможно также с помощью так называемых логических связок && и ||,означающих, соответственно, логические операции “и” и “или”. При этомлогическому значению “истина” соответствует успешное завершение команды, а значению “ложь” – неуспешное. Командная строка$ cmd1 && cmd2заставит интерпретатор выполнить сначала команду cmd1, а затем вслучае ее успешного завершения – команду cmd2; в случае неуспешного завершения первой команды вторая выполняться не будет.
Наоборот,командная строка$ cmd1 || cmd2подразумевает запуск cmd2 в случае неуспешного завершения cmd1.Приоритет логических связок между собой – традиционный (то есть “и”приоритетнее, чем “или”. В то же время, приоритет операций “конвейер” иперенаправлений ввода-вывода выше, чем приоритет логических связок; так,команда$ cmd1 && cmd2 | cmd3представляет собой связку между командой cmd1 и конвейером cmd2 | cmd3как целым. Значение «истинности» конвейера определяется успешностью илинеуспешностью выполнения последней из составляющих его команд.Очередность применения операций, как обычно, можно изменить использованием круглых скобок, например:26$ (cmd1 && cmd2) | cmd3В этом примере стандартный вывод команд cmd1 и cmd2 (если, конечно, онавообще будет выполняться), будет направлен на стандартный ввод cmd3.Для более подробной информации о программировании на языкеBourne Shell следует обратиться к специальной литературе [1].2.9.2Протоколирование сеанса работы (команда script)При выполнении заданий практикума часто требуется представитьпротокол сеанса работы с программой, т.е.
текст, включающий как информацию, вводимую пользователем, так и информацию, выдаваемуюпрограммой. Это легко сделать с помощью команды script.Чтобы начать протоколирование, запустите команду script с однимпараметом, задающим имя файла протокола. Для окончания протоколирования нажмите Ctrl-D ("конец файла"). Например:$ script my_protocol.txtScript started, file is my_protocol.txt$ lsa1.cDocumentsmy_protocol.txt tmp$ echo "abc"abc$ [Ctrl-D]Script done, file is my_protocol.txtФайл my_protocol.txt теперь содержит протокол сеанса работы:Script$ lsa1.c$ echoabc$Script2.9.3started on Wed Nov 17 16:31:54 2005Documents"abc"my_protocol.txt tmpdone on Wed Nov 17 16:32:14 2005Команды head и tailПри работе в среде ОС Unix, особенно в процессе разработки программ, могут оказаться очень полезными команды head и tail.
Эти команды служат для просмотра содержимого в начале и в конце файла,соответственно (по умолчанию показывается 10 первых или последнихстрок). Так, команда27$ head prog.cпокажет 10 первых строк файла prog.c, что может быть полезно, например, чтобы узнать, какие заголовочные файлы в него включаются.Командам head и tail можно указать и несколько файлов за одинраз. Например, можно быстро просмотреть начало всех файлов с программами на языке C в текущей директории, выполнив команду$ head *.c *.hНа экран (точнее, в стандартный вывод) будут выведены первые 10строк9 каждого файла из текущей директории с расширением .c или .h.При этом перед выдачей информации из очередного файла выводитсяимя этого файла.Количество строк, которые следует вывести, можно задать в командной строке. Например, команды$ head -25 prog.c$ tail -25 prog.cвыдадут, соответственно, 25 первых или 25 последних строк файлаprog.c.Команда tail особенно удобна для отслеживания появления новойинформации в конце файла, в который постоянно производится вывод(например, в файле протокола).
Так, команда$ tail -f mylog.txtвыдаст последние 10 строк файла mylog.txt, а затем будет выводитьновые строки по мере того, как они появляются в файле. Завершить работу команды можно стандартным образом – нажав комбинацию клавиш Ctrl-C.Важным свойством этих команд (как и многих других) является то,что они могут работать как фильтры10 . Например, команда$ gcc -c sh.c 2>&1 | head -20выведет на экран первые 20 строк диагностики компилятора gcc (в случае, если есть ошибки, конечно).
Заметим, что здесь понадобилось объединить стандартный поток сообщений об ошибках (2) со потоком стандартного вывода (1) с помощью конструкции 2>&1 (см. § 2.5, табл. 5), посколькуконвейер перенаправляет только поток стандартного вывода.9Вслучае, если в файле меньше 10 строк, будет выведен весь файлфильтом понимается программа, читающая некий поток данных со своегостандартного ввода, выполняющая те или иные преобразования и выдающая результаты в поток стандартного вывода; именно из таких программ строятся конвейеры.10 Под282.9.4Команда catЭта команда копирует содержимое файлов, указанных в команднойстроке, в поток стандартного вывода.
Например, можно просмотретьсодержимое файла без обращения к текстовому редактору, используяследующий конвейер:$ cat sh.c | lessНапомним, что команда less используется для постраничного просмотра текста.В зависимости от опций команда cat может преобразовывать свойввод. Например, команда$ cat -n sh.cвыдаст содержимое файла sh.c, пронумеровав все его строки, начинаяс единицы. Команда$ cat -v fl.txtраспечатает файл fl.txt, показывая все управляющие символы (т.е.символы с кодами из дапазона 0–31), кроме LF (перевод строки) и TAB(табуляция), и символы с кодом больше 127, в пригодном для восприятия виде. Управляющие символы показываются в виде ^СИМВОЛ,причем код символа получается из кода соответствующего управляющего символа прибавлением 64 (0x40). Например, символу с кодом 0соответствует ^@, с кодом 1 – ^A, с кодом 2 – ^B, с кодом 13 – ^M и т.д.(символ @ имеет код 64, латинская заглавная буква A – 65 и т.д.)Символы с кодами больше 127 (из т.н.
национальной половины кодового набора) показываются в виде M-СИМВОЛ, причем код символаполучается из кода соответствующего национального символа вычитанием 129 (0x80). При этом, если получаемый СИМВОЛ относится ккатегории управляющих (и, как следствие, не имеет визуального образа), то он изображается в виде ^СИМВОЛ, как было объяснено выше.Например, если файл binary_file содержит следующую информацию(побайтно в 16-ичном виде):80 FF D0 0Aто команда$ cat -v binary_fileвыдаст следующую строку29M-^@M-^?M-Pтак как код @ – 0x40, код ? – 0x3F, код заглавной латинской буквы P –0x50.Отметим, что и команда cat может работать в режиме фильтра,т.е.
читать информацию из потока стандартного ввода. Это происходит, если в командной строке не задано ни одного имени файла; в этомслучае команда просто копирует поток ввода в поток вывода. С учетомвышеописанных возможностей преобразования такой режим командыможет оказаться весьма полезен. Также команда cat без параметров (тоесть в режиме буквального копирования ввода на вывод) оказываетсяполезной в связке с другими программами; так, связка$ ./prog1 | (head -5 ; cat > /dev/null )позволяет увидеть первые пять строк выдачи команды prog1, при этомдав программе доработать до конца (при отсутствии команды cat программа prog1 получила бы сигнал SIGPIPE после окончания выполнения head и была бы, скорее всего, снята с выполнения).2.9.5Команды wc и yesЭти команды удобно использовать, например, для отладки консольных приложений.Команда wc подсчитывает количество строк, слов и байтов в файледля каждого файла, специфицированного в командной строке:$ wc /etc/resolv.conf8 15 131 /etc/resolv.confЭто означает, что файл /etc/resolv.conf содержит 8 строк, 15 слов и131 байт.
Как и другие программы, wc может использоваться в режимефильтра для подсчета символов, строк и слов в потоке стандартноговвода (в этом случае имя файла не печатается):$ cat /etc/resolv.conf | wc815131Перечислим некоторые пции команды wc:• -c – подсчитывать количество байтов• -m – подсчитывать количество символов (заметим, что количествосимволов может быть меньше количества байтов для некотоыхкодировок, например, UNICODE или UTF-8)30• -w – подсчитывать количество слов• -l – подсчитывать количество строк• -L – вычислить максимальную длину строкиОтметим, что под словом понимается последовательность символов,ограниченная пробельными символами (т.е.