Колисниченко Д.Н. - Linux-сервер своими руками (1077324), страница 100
Текст из файла (страница 100)
Создание RPM-пакетовДля выхода из редактора vi без сохранения изменений, перейдите в режимпоследней строки, введя символ ":", а затем введите команду q!. Для записиизменений введите команду w, для выхода и сохранения — команду wq.Если вы хотите редактировать другой файл без выхода из vi, введитекоманду е filename в режиме последней строки. Перед этим нужно сохранитьтекущий файл или использовать команду е! filename для загрузки новогофайла без сохранения изменений в текущем файле.Добавить к редактируемому файлу другой файл позволяет команда гfilename в режиме последней строки.
Выполнить команду интерпретаторакоманд операционной системы можно с помощью команды :г! команда,например, :r! Is /etc. Тогда результат выполнения этой команды будетдобавлен к текущему файлу.79.7. Интерпретатор команд bashИнтерпретатор команд — это программа, выполняющая команды пользователя. Стандартным интерпретатором (или оболочкой) является bash (BourneAgain Shell). Достаточно распространенными также являются следующиеинтерпретаторы: sh, ash, bsh, tcsh, csh, zsh. Список установленных в вашейсистеме оболочек находится в файле /etc/shells.
Команды оболочкиможно вводить в командной строке, а можно оформить в виде сценария.Сценарий — это файл, содержащий команды оболочки. Создайте обыкновенный текстовый файл и сделайте его исполнимым. Система выполнитуказанную последовательность команд. Для того, чтобы система узнала,какую оболочку нужно использовать, первая строка сценарий должна содержать полное имя сценария.Например:#!/bin/bashМежду символами # и ! не должно быть пробелов. Для обработкисценария вы можете использовать любую программу (естественно, она должна понимать синтаксис файла), а не только указанную в файле/etc/shells.
Например, вы можете написать:#!/usr/bin/my_progaОболочка при этом запустит программу /usr/bin/my_proga и передаетимя файла сценария в качестве параметра. Если вы напишете:#!/usr/bin/my_proga -fто оболочка выполнит команду:#!/usr/bin/my_proga -f <имя_сценария>Создадим небольшой сценарий, который будет очищать экран и выводить на него ваше имя. Имя можно передать как параметр. Назовем нашсценарий test:#!/bin/bash# Это комментарийclearecho $1434Полезные команды и программы.
Создание RPM-пакетовТеперь рассмотрим все по порядку. С первой строкой, я думаю, всеясно. Вторая строка очищает экран. Третья строка выводит информацию,которая передана сценарию как первый (1) параметр. Запустите сценарийследующим образом:. / t e s t Vasya PupkinНа экране будет напечатан первый параметр, то есть слово Vasya. Выможете немного изменить сценарий, чтобы он выводил оба параметра:echo $1 $2Если вы хотите передать фамилию, имя и отчество, то нужно использовать следующую команду:echo "$1"При этом не нужно явно указывать три параметра, просто интерпретаторне будет использовать пропуск для разделения параметров и все, что выпередадите ему, будет считаться одним параметром. При этом, если вызапустите сценарий с параметром Vasya Pupkin, на экране увидите VasyaPupkin.
А если укажете параметр Ivanov Ivan Ivanovich, сценарий так инапечатает Ivanov Ivan Ivanovich.19.7.1. Каналы и спискиМатериал этого и следующего пункта дополняет гл. 5, в которой рассматривалось перенаправление ввода/вывода. Поэтому я не буду подробноописывать сам механизм этих процессов, а ограничусь лишь несколькимипримерами, чтобы напомнить вам гл. 5.С помощью каналов вы можете перенаправить стандартный вывод однойпрограммы на стандартный ввод другой.
Например:cat / v a r / l o g / s e c u r e | lessps -ax | grep "$UID" | lessВ первом случае стандартный вывод команды cat (содержимое файла/var/log/secure) перенаправляется на стандартный ввод программы less,которая обеспечивает поэкранный вывод информации. Вторая строка выводитсписок всех процессов, принадлежащих данному пользователю. Первая команда ps-ax выводит список всех запущенных в системе процесов, вторая (grep"$U1D") ищет фрагмент текста, содержащий идентификатор пользователя (UID)и выводит результат на стандартный вывод, то есть на стандартный вводкоманды less. $UID является переменной окружения, которая содержит идентификатор пользователя. О переменных окружения поговорим немного позже.Интерпретатор позволяет указывать списки команд в командной строке.Например:l p r ~ f i l e .
t x t ; IpqПри этом сначала выполняется команда постановки задания в очередь печати, а потом проверяется состояние принтера. Теперь более сложный пример:ps -ax | head -n I; ps -ax | grep httpdСначала выполняется команда ps для печати заголовка таблицы, а потом — для вывода информации о демоне httpd.435Полезные команды и программы. Создание RPM-пакетовМожно использовать операции конъюнкции и дизъюнкции, например:commandl && comand2commands | | command4Команда commandl будет выполнена в случае успешного завершениякоманды commandl (возвратный код равен 0). Команда command4 будетвыполнена, если код возврата команды commands не равен 0. Самый простой пример — создание и изменение каталога:mkdir mydir && cd mydirОбычно интерпретатор bash выполняет команды в синхронном режиме, тоесть после запуска программы ожидает ее завершения.
Однако можно запустить программу и в асинхронном режиме, то есть без ожидания ее завершения. Для этого нужно использовать символ «&» в конце команды, например:program &19.7.2. Перенаправление ввода/выводаПеренаправление ввода/вывода уже рассматривалось в гл. 5, поэтому ялишь напомню общий формат команд:команда > (») файлсписок > (») файлКак вы уже знаете, при использовании одного знака больше файл, вкоторый переназначен вывод, будет перезаписан, а при использовании двойного больше информация будет добавлена в конец файла.
При использовании списка команд список нужно взять в фигурные скобки:{date; free; who; } > l o g f i l eПеренаправление ввода/вывода может быть использовано и в обратномнаправлении. Например, для печати списка URL достаточно выполнитькоманды:Ipr « URLhttp://www.linux.ruhttp://linux.ru.nethttp://www.linux.orgURL19.7.3. ПодоболочкиПри написании сценариев вы можете использовать механизм подоболочек. Если вы знакомы с каким-нибудь языком программирования, то должны знать об области распространения действия переменных. Существуютглобальные и локальные переменные.
Первые действуют во всей программе,а вторые только внутри определенного блока, например, функции. Если влокальной функции определена переменная с таким же именем, что и однаиз глобальных переменных, в этом локальном блоке будет использоватьсязначение локальной переменной. Далее приведен простейший пример программы, использующей локальные и глобальные переменные на языке Pascal:P r o g r a m Test;V a r A : integer;436{ г л о б а л ь н а я переменная}Полезные команды и программы. Создание RPM-пакетовprocedure GetLocal;var A : integer; {локальная переменная)beginА:=10;writeln(A);end;beginА: =7;writeln(A);GetLocal(A);writeln(A);end;При запуске программа выведет на экран:7107В bash наблюдается нечто подобное.
Этот блок называется подоболочкой. Если список команд заключен в фигурные скобки, то он выполняетсяв текущей оболочке, а если в обыкновенные, то в подоболочке. Итак,рассмотрим выполнение почти аналогичных сценариев:#!/bin/bash# Сценарий 1NUM="one";echo $NUM(NUM="two"; echo $NUM;);#!/bin/bash# Сценарий 2NUM="one"; {NUM="two"; echo $NUM;};echo $NUMСценарий 1 выведет на экран следующую информацию:twooneа сценарий 2:twotwoС помощью механизма подоболочек вы можете создавать более гибкие сценарии. С его помощью, например, можно временно изменятьрабочий каталог:pwd; (cd /tmp; p w d ; ) ; pwdСценарий выведет на экран:/home/user/tmp/home/user437Полезные команды и программы.
Создание RPM-пакетов19.7.4. Переменные и массивыПример простейшей переменной мы уже рассмотрели выше. Переменные в bash не нуждаются в предварительном описании, как в других языках,например, в том же Pascal. Все переменные в bash — текстовые. Имяпеременной должно начинаться с буквы и может состоять из латинскихбукв, цифр, знака подчеркивания. Нельзя определять функцию и переменную с одинаковыми именами. Чтобы воспользоваться значением переменной, нужно использовать символ доллара перед именем переменной:VAR="my var"echo $VARКак я уже говорил, все переменные текстовые.