Что такое операнд в линукс
Во второй секции указаны выходные операнды инструкции. Каждому операнду соответствует строка адресации и выражение языка С, записанное в скобках. В случае выходных операндов (все они должны быть левосторонними значениями) строка адресации должна начинаться со знака равенства. Компилятор проверяет, действительно ли каждый выходной операнд является левосторонним значением (т.е может стоять в левой части оператора присваивания).
Список обозначений регистров для конкретной архитектуры можно найти в исходных текстах компилятора gcc (конкретнее — в определении макроса REG_CLASS_FROM_LETTER). Например, в файле gcc/config/i386/i386.h содержатся обозначения, соответствующие архитектуре x86 (табл. 9.1).
Таблица 9.1. Обозначения регистров в архитектуре Intel x86
Символ регистра Регистры, которые могут использоваться компилятором gcc R Регистры общего назначения (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP) q Общие регистры хранения данных (EAX, ЕВХ, ECX, EDX) f Регистр для чисел с плавающей запятой t Верхний стековый регистр для чисел с плавающей запятой u Второй после верхнего стековый регистр для чисел с плавающей запятой a Регистр EAX b Регистр EBX с Регистр ECX d Регистр EDX x Регистр SSE (регистр потокового расширения SIMD) y Мультимедийные регистры MMX A Восьмибайтовое значение, формируемое из регистров EAX и EDX D Указатель приемной строки в строковых операциях (EDI) S Указатель исходной строки в строковых операциях (ESI)
Если есть несколько однотипных операндов, то они разделяются запятыми, как показано в секции входных операндов. Всего можно задавать до десяти операндов, адресуемых как %0, %1, … %9. Если выходные операнды отсутствуют, но есть входные операнды или модифицируемые регистры, то вторую секцию следует оставить пустой или пометить ее комментарием наподобие /* нет выходных данных */.
Глава 17. Выходные на носу
Глава 17. Выходные на носу И в газете «Ведомости», и в «ЭхоНете» на протяжении нескольких лет в последний день рабочей недели, накануне выходных, когда даже в пафосных офисах смягчают дресс-код и не так строго следят за дисциплиной, я рассказываю об онлайновых играх. Не
Выходные характеристики схемы с общим эмиттером
Выходные характеристики схемы с общим эмиттером Чтобы представить модель биполярного транзистора, мы используем схему смещения усилителя с ОЭ, представленную на рис. 9.19. Такую схему вы могли бы использовать, если бы вам пришлось исследовать выходные характеристики
Выходные характеристики
Выходные характеристики Схема для получения выходных характеристик (рис. 10.1) содержит источник постоянного напряжения VCC с варьируемым выходным напряжением и источник постоянного тока IВ с варьируемым током. Транзистор обозначен как Q1. При использовании встроенной
Выходные характеристики полевых транзисторов
Выходные характеристики
Выходные характеристики Q2N3904
Выходные характеристики Q2N3904 Для получения выходных характеристик вернемся к схеме на рис. 10.1. Создайте новый проект в Capture с именем bjtchar. Введем компонент IDC, затем R (для RB), затем снова R (для RC), затем VDC и 0 для «земли». Затем выберем транзистор типа Q2N3904 из библиотеки eval.
Операнды
Операнды Операндом выражения может быть константа, идентификатор или символьная строка. Эти операнды могут посредством так называемых первичных операций комбинироваться в первичные выражения — вызов функции, индексное выражение, выражение выбора элемента. Эти
Выходные наборы в качестве входных наборов
Выходные наборы в качестве входных наборов Сгруппированные или агрегатные запросыSQL имеет важную возможность использовать входной набор, сформированный из выходного набора, сгенерированного в том же самом запросе SELECT - предложение GROUP BY. Вместо того чтобы выходной
В этом разделе описываются основные, наиболее употребительные команды системы UNIX, включая и те, которые встречались в предыдущих разделах.
Отметим, что опции команд обычно начинаются с символа -, и обычно после одного символа - можно указать сразу несколько опций. Например, вместо команды ls -l -F можно ввести команду ls -lF .
В данном разделе не будут даваться все опции для всех команд. Многие опции большинства команд пользователям никогда не потребуются. Для того, чтобы получить полный список опций для каждой команды, можно использовать команду man .
Также обращаем ваше внимание, что в качестве аргументов этих команд могут выступать списки имён файлов или каталогов. Например, аргументами команды cp выступают имена файлов, которые будут копироваться. Список копируемых файлов замыкается именем файла (или каталога), куда будут копироваться файлы. При копировании более чем одного файла в конце должно стоять имя каталога.
завершить исполнение оболочки
Семантика: exit завершает исполнение оболочки с кодом возврата (0–255), указанным в
. Перехват exit командой trap выполняется до завершения оболочки, если только exit выполняется не из этой команды trap . Если n не указана, код возврата равен коду возврата последней выполненной команды. При выполнении exit из trap последней командой считается команда, выполненная непосредственно до выполнения trap .
Семантика: cal выводит на стандартный вывод календарь, используя юлианское летосчисление для дат с 1 января 1 г. по 2 сентября 1752 г. и григорианское — с 14 сентября 1752 г. по 31 декабря 9999 г.
Аргументы: месяц — отображаемый месяц указывается десятичным числом с 1 (январь) по 12 (декабрь). По умолчанию – текущий месяц. Год — отображаемый год указывается десятичным числом с 1 до 9999. По умолчанию – текущий год.
вывести или установить дату и время
date [-u ммддччмм ] [[[сс]]гг]
Семантика: date выводит дату и время. Поданная с операндом в формате даты, date пытается установить время и дату. Операнд, начинающийся с + устанавливает формат вывода данных.
Ключ: -u — выполнить команду, как если бы переменная TZ (часовой пояс) была установлена в UTC0 или GMT0 (время по Гринвичу).
Аргументы: +формат — если указан формат, каждый спецификатор формата заменяется при выводе на соответствующее значение. Вывод всегда завершается символом новой строки. Поддерживаются спецификаторы %a (краткое название дня недели), %A (название дня недели), %b, %h (краткое название месяца), %B (название месяца), %с (дата и время), %C (век в двузначном представлении), %d (день месяца в двузначном представлении), %D (дата в формате мм/дд/гг), %e (день месяца в одно- или двузначном представлении), %H (час дня в 24-часовом двузначном представлении), %I (час дня в 12-часовом двузначном представлении), %j (номер дня в году), %m (номер месяца в двузначном представлении), M (минуты в двузначном представлении), %n (конец строки), %p (знак утра или пополудни), %r (час дня в двенадцатичасовом представлении со знаком утра или пополудни), %S (секунды в двузначном представлении), %t (табуляция), %T (время в формате ЧЧ:ММ:СС в 24-часовом представлении), %u (порядковый номер дня недели (Пн.=1), %U (порядковый номер недели в году при неделе, начинающейся в воскресенье), %V (номер недели в году при неделе, начинающейся в понедельник), %w (номер дня недели, начинающейся с воскресенья), %W (номер недели, начинающейся в понедельник), %x (полное представление даты), %X (полное представление времени), %y (год в двузначном представлении), %Y (год в одно- или двузначном представлении), %Z (часовой пояс), %% (процент).
Переменные: TZ — часовой пояс, в котором выводится или устанавливается дата.
Вывод: если формат не указан, дата выводится в формате +%a %b %e %H:%M:%S %Z %Y.
вывести системную документацию
Семантика: man выводит информацию о каждом из перечисленных операндов.
— интерпретировать операнды как ключевые слова для поиска в базе кратких описаний и вывести строки, в которых содержатся эти слова.
Аргументы: имя — ключевое слово или имя команды.
Переменные: PAGER — используемый фильтр постраничного вывода.
Семантика: echo выводит свои аргументы после раскрытия специальных символов в стандартный вывод, завершая вывод символом новой строки.
Аргументы: строка — строка, подлежащая выводу. В строке после раскрытия спецсимволов оболочки раскрываются следующие символы: \a — звуковой сигнал, \b — пробел, \c — подавить вывод символа новой строки, \f — перевод страницы, \n — символ конца строки, \r — символ возврата каретки, \t — табуляция, \v — вертикальная табуляция, \\ — обратная косая черта, \0код — символ с восьмеричным кодом « код ».
Стандартный вывод: между аргументами выводятся пробелы.
изменить временные атрибуты доступа и модификации файлов
touch [-acm] [ [[-r справ_файл ] | [-t time ] файл. ] ]
Семантика: touch изменяет атрибуты времени последней модификации или времени последнего доступа файлов, или (по умолчанию) оба. Значение атрибута указывается аргументом ключа -t или заимствуется у файла, указанного в качестве аргумента ключа -r. Если оно не указано, используется текущее время.
Если файлы не существуют, они создаются.
Ключи: -a — изменить время доступа, -c — не создавать несуществующих файлов, -m — изменить время модификации, -r справ_файл — заимствовать атрибут у файла справ_файл; -t время — использовать вместо текущего указанное время в формате [[ВВ]ГГ]ММДДччмм[.сс], где ММ — номер месяца, ДД — день месяца, чч — час дня, мм — минуты, ВВ — первые две цифры года, ГГ — последние две цифры года, сс — секунды.
Аргументы: файл — имя файла.
вывести содержимое каталога
ls [-CFRacdilqrtu1] [[-H] | [-L]] [-fgmnopsx] [ файл. ]
Семантика: Для каждого операнда, именующего файл типа иного, нежели каталог или ссылка на каталог, ls выводит имя и требуемую ключами информацию. Для каждого операнда, именующего каталог или ссылку на каталог, ls выводит имена и требуемую ключами информацию о каждом файле, содержащемся в этом каталоге. Если операнды не указаны, ls выводит информацию о файлах в текущем каталоге. Для ссылок на каталоги выводится информация о каталоге, если даны ключи -d, -F или -l и не даны ключи -H или -L, и информация о файлах в каталоге, если не даны ключи -d, -F или -l или даны ключи -H или -L.
Важнейшие ключи: -R — выводить рекурсивно информацию о подкаталогах; -a — включить информацию о скрытых файлах (файлах с именами, начинающимися на точку), -l (« эль ») — выводить информацию в « длинном » формате; -p — выводить после имён каталогов « / »; -t — отсортировать в порядке времени изменения.
Аргументы: файл — имя файла.
Переменные: COLUMNS — количество столбцов на терминале; TZ — часовой пояс.
Вывод: по умолчанию выводится по одной записи в строке. -l — выводятся тип и права файла, количество ссылок, имя владельца, имя группы, длина файла, дата и время, имя файла.
удалить записи о файлах
Семантика: rm удаляет запись в каталоге для каждого операнда за исключением файлов . или .. в любом каталоге и за исключением (если не даны ключи -r, -R) каталогов.
Ключи: -f — не запрашивать подтверждения; -i — запрашивать подтверждение; -r, -R — рекурсивно удалять содержимое указанных каталогов.
Аргументы: файл — имя файла.
Вывод ошибок: стандартный вывод ошибок используется для вывода запросов на подтверждение удаления файлов (-i).
mkdir [-p] [-m права ] [ каталог. ]
Семантика: mkdir создаёт перечисленные каталоги.
Аргументы: каталог — создаваемый каталог.
rmdir — удалить каталоги
rmdir [-p] [ каталог. ]
Семантика: rmdir удаляет записи, соответствующие указанным пустым каталогам.
Аргументы: каталог — удаляемый каталог.
cp [-fip] [ исх_файл ] [ цел_файл ]
cp [-fip] [ исх_файл. ] [ каталог ]
cp [-fip] [-R] [[-H] | [-L] | [-P]] [-fip] [ исх_файл. ] [ каталог ]
cp [-fip] [-r] [[-H] | [-L] | [-P]] [-fip] [ исх_файл. ] [ каталог ]
Семантика: первая синтаксическая форма характеризуется двумя файлами, ни один из которых не должен быть существующим каталогом. cp копирует исх_файл в цел_файл. Если исх_файл — символическая ссылка, копируется целевой файл этой ссылки.
Вторая синтаксическая форма характеризуется двумя или более операндами, отсутствием ключей -R или -r и неприменимостью первой формы. Исходные файлы не должны быть каталогами, а каталог должен быть существующим каталогом. cp копирует исходные файлы в указанный каталог под именами, совпадающими с краткими именами исходных файлов.
Третья и четвёртая форма характеризуется двумя или более операндами и ключами -r или -R. cp копирует все указанные файлы, а также рекурсивно каталоги с их содержимым в каталог.
Важнейшие ключи: -i — запрашивать подтверждение перед копированием в существующие файлы; -p — сохранять по возможности времена изменения и доступа к файлу, владельца и группу, права доступа; -R, -r — рекурсивно копировать содержимое каталогов.
Аргументы: исх_файл — исходный файл; цел_файл — целевой файл; каталог — целевой каталог.
Стандартный вывод ошибок: стандартный вывод ошибок используется для вывода запросов на подтверждение перезаписи существующих файлов (-i).
mv [-fi] [ исх_файл. ] [ цел_файл ]
mv [-fi] [ исх_файл. ] [ каталог ]
Семантика: в первой синтаксической форме, характеризующейся тем, что последний операнд не является ни каталогом, ни символической ссылкой на каталог, mv перемещает исх_файл в цел_файл.
Во второй синтаксической форме cp копирует исходные файлы в указанный каталог под именами, совпадающими с краткими именами исходных файлов.
Ключи: -f — не запрашивать подтверждения перезаписи существующих файлов; -i — запрашивать подтверждение перезаписи существующих файлов.
Аргументы: исх_файл — исходный файл; цел_файл — целевой файл; каталог — целевой каталог.
Стандартный вывод ошибок: стандартный вывод ошибок используется для вывода запросов на подтверждение перезаписи существующих файлов (-i).
Семантика: echo выводит свои аргументы после раскрытия специальных символов в стандартный вывод, завершая вывод символом новой строки.
Аргументы: строка — строка, подлежащая выводу. В строке после раскрытия спецсимволов оболочки раскрываются следующие символы: \a — звуковой сигнал, \b — пробел, \c — подавить вывод символа новой строки, \f — перевод страницы, \n — символ конца строки, \r — символ возврата каретки, \t — табуляция, \v — вертикальная табуляция, \\ — обратная косая черта, \0код — символ с восьмеричным кодом « код ».
Стандартный вывод: между аргументами выводятся пробелы.
вывести содержимое файлов
Семантика: cat последовательно выводит содержимое файлов.
Ключ: -u — читать и выводить файлы побайтно (по умолчанию — построчно).
Аргументы: файл — выводимый файл. Если файл не указан, читается стандартный ввод. Если в списке файлов присутствует имя -, вместо этого файла читается стандартный ввод.
Реализация: в большинстве систем ключ -u не реализован.
chmod — изменить права на файл
chmod [-R] [ режим ] [ файл . ]
Семантика: chmod изменяет биты режима доступа к каждому указанному файлу в соответствии с указанным режимом. Изменить режим доступа к файлу может только процесс с действующим идентификатором пользователя, совпадающим с владельцем файла, или привилегированный процесс.
Ключ: -R — рекурсивно изменять режим доступа к файлам, расположенным в указанных каталогах.
Аргументы: режим — устанавливаемый режим доступа (в rwx- или числовой нотации); файл — имя файла.
вывести или установить маску прав доступа
Семантика: umask устанавливает маску прав вновь создаваемых в окружении текущей оболочки файлов в соответствии с указанным значением. Если операнд маска не указан, umask выводит текущую маску.
Ключ: -S — вывести маску в rwx-нотации.
Операнд: маска — маска прав в rwx- или числовой нотации.
вывести состояние процессов
ps [-aA] [-defl] [-G список ] [-o формат. ] [-p список ] [-t список ] [-U список ] [-g список ] [-n список ] [-u список ]
Семантика: ps выводит информацию о процессах в рамках собственных привилегий. По умолчанию выводится информация о процессах с теми же действующим UID и управляющим терминалом, что и у подающего команду пользователя.
Основные ключи: -a — вывести информацию о процессах, ассоциированных с терминалами; -A — вывести информацию о всех процессах; -f — вывести « полный » список; -l — вывести « длинный » список; -o формат — вывести список в указанном формате; -p список — вывести информацию о процессах с перечисленными в списке PID; -u список — вывести информацию о процессах с перечисленными идентификаторами или именами пользователей.
перевести задание на задний план
Семантика: bg возобновляет выполнение приостановленных процессов на заднем плане.
Операнд: идентификатор — PID ведущего процесса задания или номер задания, предварённый знаком %.
перевести задание на передний план
Семантика: fg возобновляет выполнение приостановленных процессов на переднем плане или переводит процессы заднего плана на передний.
Операнд: идентификатор — PID ведущего процесса задания или номер задания, предварённый знаком « % ».
вывести состояние заданий в текущем сеансе
jobs [[-l] | [-p]] [идентификатор. ]
Семантика: jobs выводит состояние заданий в окружении текущей оболочки.
Ключи: -l (« эль ») — вывести полную информацию (номер задания, текущее задание, идентификатор группы, состояние и команду) для каждого задания; -p — вывести только идентификатор ведущего процесса каждого задания.
Операнд: идентификатор — PID ведущего процесса задания или номер задания, предварённый знаком %.Если операнд отсутствует, выводится информация о всех заданиях.
прекратить исполнение процесса или передать ему сигнал
kill [-s] [сигнал] [идентификатор] [. ]
kill [-l] [статус_завершения]
kill [-сигнал] [ идентификатор ] [ . ]
kill [-номер_сигнала] [ идентификатор ] [ . ]
Семантика: kill посылает указанный сигнал указанным процессам.
Ключи: -l (« эль ») — вывести список поддерживаемых сигналов; -s сигнал — послать сигнал с указанным именем; -сигнал — эквивалент -s сигнал; -номер_сигнала — послать сигнал с указанным номером.
Аргументы: идентификатор — идентификатор процесса или предварённый знаком % номер задания; статус_завершения — код завершения, возвращаемый завершённым процессом.
установить или сбросить ключи и позиционные параметры, вывести список установленных переменных
set [-abCefmnuvx] [-h] [-o ключ ] [аргумент. ]
set [+abCefmnuvx] [+h] [+o ключ] [аргумент. ]
Семантика: будучи подана без аргументов, set выводит имена и значения всех переменных оболочки, разделённые знаком =, по одной на каждой строке.
Будучи подана с аргументами, set устанавливает или сбрасывает ключи и позиционные параметры текущей оболочки. Эта функциональность в настоящем курсе не рассматривается.
установить окружение для издаваемой команды
env [-i] [имя=значение] [ . ] [утилита [[аргумент. ]]]
Семантика: будучи подана без аргументов, env выводит имена и значения всех экспортированных переменных, разделённые знаком =, по одной на каждой строке.
Будучи подана с аргументами, env модифицирует текущее окружение и запускает в нем указанную команду. Эта функциональность в настоящем курсе не рассматривается.
сделать переменные экспортируемыми
Семантика: оболочка устанавливает атрибут экспортируемости переменным, перечисленным в команде export , что включает их в окружение далее издаваемых команд. При указании ключа -p команда выводит выводит имена и значения всех экспортированных переменных, разделённые знаком = (если переменная установлена) или только их имена (если переменная сброшена), по одной на каждой строке, предваряя их цепочкой export.
Ключ: -p — вывести список экспортированных переменных и их значений.
nl [-p] [-b тип ] [-d ограничитель ] [-f тип ] [-h тип ] [-i приращение ] [-l номер ] [-n формат ] [-s разделитель ] [-v нач_номер ] [-w ширина ] [файл]
Семантика: nl читает строки из указанного файла (или стандартного ввода, если файл не указан) и выводит их в стандартный вывод, предваряя номерами.
Начало каждого из разделов указывается строкой, не содержащей ничего, кроме цепочки \:\:\: (начало верхнего колонтитула), \:\: (начало тела) или \: (начало нижнего колонтитула). При отсутствии таких строк файл считается содержащим единственную страницу.
Ключи: ключи команды nl позволяют указать различные параметры нумерации и формата вывода, и в настоящем курсе не рассматриваются.
Операнд: файл — имя файла. При отсутствии операнда строки вводятся из стандартного ввода.
сортировать, слить или проверить сортировку строк в файле
sort [-m] [-o вывод ] [-bdfinru] [-t символ ] [-k опр_ключа ] [. ] [файл. ]
sort [-c] [-bdfinru] [-t символ ] [-k опр_ключа ] [файл]
Семантика: sort выполнит одно из следующего: 1) отсортирует строки всех указанных файлов и выведет результат в указанный файл вывод; 2) сольёт построчно (предварительно отсортированные) файлы и выведет результат в указанный файл вывод или 3) проверит единственный указанный файл на сортировку. Сравнения будут выполняться на основании указанных ключей или на основании строки в целом (вплоть до символа новой строки исключительно), с учётом порядка сортировки, определённого текущей локалью.
Ключи: ключи sort позволяют задавать параметры сортировки, слияния или проверки, и в настоящем курсе не рассматриваются. При отсутствии ключей строки ввода сортируются в прямом алфавитном порядке.
Операнд: файл — имя файла. Если файл не указан, сортируется стандартный ввод.
дублировать стандартный ввод
Семантика: tee копирует стандартный ввод в стандартный вывод, дублируя его в один или более файлов.
Ключи: -a — добавить вывод в конец существующих файлов; -i — игнорировать сигнал SIGINT.
В прошлый раз, в третьей части этой серии материалов по bash-скриптам, мы говорили о параметрах командной строки и ключах. Наша сегодняшняя тема — ввод, вывод, и всё, что с этим связано.
Вы уже знакомы с двумя методами работы с тем, что выводят сценарии командной строки:
- Отображение выводимых данных на экране.
- Перенаправление вывода в файл.
Стандартные дескрипторы файлов
Всё в Linux — это файлы, в том числе — ввод и вывод. Операционная система идентифицирует файлы с использованием дескрипторов.
Каждому процессу позволено иметь до девяти открытых дескрипторов файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот что они означают.
- 0 , STDIN — стандартный поток ввода.
- 1 , STDOUT — стандартный поток вывода.
- 2 , STDERR — стандартный поток ошибок.
STDIN
STDIN — это стандартный поток ввода оболочки. Для терминала стандартный ввод — это клавиатура. Когда в сценариях используют символ перенаправления ввода — < , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.
Многие команды bash принимают ввод из STDIN , если в командной строке не указан файл, из которого надо брать данные. Например, это справедливо для команды cat .
Когда вы вводите команду cat в командной строке, не задавая параметров, она принимает ввод из STDIN . После того, как вы вводите очередную строку, cat просто выводит её на экран.
STDOUT
Итак, у нас есть некий файл с данными, к которому мы можем добавить другие данные с помощью этой команды:
То, что выведет pwd , будет добавлено к файлу myfile , при этом уже имеющиеся в нём данные никуда не денутся.
Перенаправление вывода команды в файл
Попытка обращения к несуществующему файлу
STDERR
▍Перенаправление потока ошибок
▍Перенаправление потоков ошибок и вывода
Перенаправление ошибок и стандартного вывода
Перенаправление STDERR и STDOUT в один и тот же файл
После выполнения команды то, что предназначено для STDERR и STDOUT , оказывается в файле content .
Перенаправление вывода в скриптах
Существует два метода перенаправления вывода в сценариях командной строки:
- Временное перенаправление, или перенаправление вывода одной строки.
- Постоянное перенаправление, или перенаправление всего вывода в скрипте либо в какой-то его части.
▍Временное перенаправление вывода
Если запустить скрипт, обе строки попадут на экран, так как, как вы уже знаете, по умолчанию ошибки выводятся туда же, куда и обычные данные.
Временное перенаправление
Запустим скрипт так, чтобы вывод STDERR попадал в файл.
▍Постоянное перенаправление вывода
Если в скрипте нужно перенаправлять много выводимых на экран данных, добавлять соответствующую команду к каждому вызову echo неудобно. Вместо этого можно задать перенаправление вывода в определённый дескриптор на время выполнения скрипта, воспользовавшись командой exec :
Перенаправление всего вывода в файл
Если просмотреть файл, указанный в команде перенаправления вывода, окажется, что всё, что выводилось командами echo , попало в этот файл.
Команду exec можно использовать не только в начале скрипта, но и в других местах:
Вот что получится после запуска скрипта и просмотра файлов, в которые мы перенаправляли вывод.
Перенаправление вывода в разные файлы
Сначала команда exec задаёт перенаправление вывода из STDERR в файл myerror . Затем вывод нескольких команд echo отправляется в STDOUT и выводится на экран. После этого команда exec задаёт отправку того, что попадает в STDOUT , в файл myfile , и, наконец, мы пользуемся командой перенаправления в STDERR в команде echo , что приводит к записи соответствующей строки в файл myerror.
Освоив это, вы сможете перенаправлять вывод туда, куда нужно. Теперь поговорим о перенаправлении ввода.
Перенаправление ввода в скриптах
Для перенаправления ввода можно воспользоваться той же методикой, которую мы применяли для перенаправления вывода. Например, команда exec позволяет сделать источником данных для STDIN какой-нибудь файл:
Эта команда указывает оболочке на то, что источником вводимых данных должен стать файл myfile , а не обычный STDIN . Посмотрим на перенаправление ввода в действии:
Вот что появится на экране после запуска скрипта.
Перенаправление ввода
Некоторые администраторы Linux используют этот подход для чтения и последующей обработки лог-файлов.
Создание собственного перенаправления вывода
Перенаправляя ввод и вывод в сценариях, вы не ограничены тремя стандартными дескрипторами файлов. Как уже говорилось, можно иметь до девяти открытых дескрипторов. Остальные шесть, с номерами от 3 до 8, можно использовать для перенаправления ввода или вывода. Любой из них можно назначить файлу и использовать в коде скрипта.
Назначить дескриптор для вывода данных можно, используя команду exec :
После запуска скрипта часть вывода попадёт на экран, часть — в файл с дескриптором 3 .
Перенаправление вывода, используя собственный дескриптор
Создание дескрипторов файлов для ввода данных
После окончания чтения файла можно восстановить STDIN и пользоваться им как обычно:
Перенаправление ввода
В этом примере дескриптор файла 6 использовался для хранения ссылки на STDIN . Затем было сделано перенаправление ввода, источником данных для STDIN стал файл. После этого входные данные для команды read поступали из перенаправленного STDIN , то есть из файла.
После чтения файла мы возвращаем STDIN в исходное состояние, перенаправляя его в дескриптор 6 . Теперь, для того, чтобы проверить, что всё работает правильно, скрипт задаёт пользователю вопрос, ожидает ввода с клавиатуры и обрабатывает то, что введено.
Закрытие дескрипторов файлов
Попытка обращения к закрытому дескриптору файла
Всё дело в том, что мы попытались обратиться к несуществующему дескриптору.
Будьте внимательны, закрывая дескрипторы файлов в сценариях. Если вы отправляли данные в файл, потом закрыли дескриптор, потом — открыли снова, оболочка заменит существующий файл новым. То есть всё то, что было записано в этот файл ранее, будет утеряно.
Получение сведений об открытых дескрипторах
Для того, чтобы получить список всех открытых в Linux дескрипторов, можно воспользоваться командой lsof . Во многих дистрибутивах, вроде Fedora, утилита lsof находится в /usr/sbin . Эта команда весьма полезна, так как она выводит сведения о каждом дескрипторе, открытом в системе. Сюда входит и то, что открыли процессы, выполняемые в фоне, и то, что открыто пользователями, вошедшими в систему.
У этой команды есть множество ключей, рассмотрим самые важные.
- -p Позволяет указать ID процесса.
- -d Позволяет указать номер дескриптора, о котором надо получить сведения.
Ключ -a используется для выполнения операции логического И над результатами, возвращёнными благодаря использованию двух других ключей:
Вывод сведений об открытых дескрипторах
Тип файлов, связанных с STDIN , STDOUT и STDERR — CHR (character mode, символьный режим). Так как все они указывают на терминал, имя файла соответствует имени устройства, назначенного терминалу. Все три стандартных файла доступны и для чтения, и для записи.
Посмотрим на вызов команды lsof из скрипта, в котором открыты, в дополнение к стандартным, другие дескрипторы:
Вот что получится, если этот скрипт запустить.
Просмотр дескрипторов файлов, открытых скриптом
Скрипт открыл два дескриптора для вывода ( 3 и 6 ) и один — для ввода ( 7 ). Тут же показаны и пути к файлам, использованных для настройки дескрипторов.
Подавление вывода
Тот же подход используется, если, например, надо очистить файл, не удаляя его:
Итоги
Сегодня вы узнали о том, как в сценариях командной строки работают ввод и вывод. Теперь вы умеете обращаться с дескрипторами файлов, создавать, просматривать и закрывать их, знаете о перенаправлении потоков ввода, вывода и ошибок. Всё это очень важно в деле разработки bash-скриптов.
В следующий раз поговорим о сигналах Linux, о том, как обрабатывать их в сценариях, о запуске заданий по расписанию и о фоновых задачах.
Читайте также: