355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Уильям Шоттс » Командная строка Linux » Текст книги (страница 4)
Командная строка Linux
  • Текст добавлен: 12 апреля 2017, 12:30

Текст книги "Командная строка Linux"


Автор книги: Уильям Шоттс


Жанр:

   

ОС и Сети


сообщить о нарушении

Текущая страница: 4 (всего у книги 30 страниц)

5. Работа с командами

До настоящего момента мы видели группы мистических команд, каждая из которых имеет свои таинственные параметры и аргументы. Теперь мы удалим часть этой таинственности и даже создадим несколько собственных команд. В этой главе будут представлены следующие команды:

• type – сообщает, как интерпретируется имя указанной команды.

• which – сообщает, какая программа будет выполнена.

• man – выводит страницу справочного руководства с описанием команды.

• apropos – выводит список подходящих команд.

• info – выводит запись из справочного руководства Info с описанием команды.

• whatis – выводит краткое описание команды.

• alias – создает псевдоним для команды.

Что такое команды?

Команда может быть:

• Выполняемой программой, как те файлы, что мы видели в каталоге /usr/bin. К этой категории относятся: скомпилированные двоичные программы, например, написанные на C и C++; программы, написанные на языках сценариев, таких как shell, Perl, Python, Ruby и др.

• Встроенной командой, реализованной внутри самой командной оболочки. Командная оболочка bash поддерживает множество внутренних команд, которые так и называют – встроенными (shell builtins). Команда cd, например, – это встроенная команда.

• Функцией командной оболочки. Функции командной оболочки (shell functions) – это миниатюрные сценарии на языке командной оболочки, встроенные в окружение. Мы еще вернемся к вопросам настройки окружения и создания функций командной оболочки в последующих главах, а пока просто помните об их существовании.

• Псевдонимом. Псевдоним (alias) – это команда, которую мы можем определить сами, сконструировав ее из других команд.

Идентификация команд

Часто бывает полезно точно знать, какому из четырех типов принадлежит команда, и Linux предлагает пару способов узнать это.

type – получение типа команды

Команда type – это встроенная команда, которая сообщает тип указанной ей команды. Вызывается она следующим образом:

type команда

где команда – это имя исследуемой команды. Например:

[me@linuxbox ~]$ type type

type встроена в оболочку

[me@linuxbox ~]$ type ls

ls является алиасом для `ls –color=tty'

[me@linuxbox ~]$ type cp

cp хэширована (/bin/cp)

Здесь мы видим результаты определения типов трех разных команд. Обратите внимание, что команда ls (в дистрибутиве Fedora) фактически является псевдонимом (alias) команды ls с параметром –color=tty. Теперь-то мы знаем, почему результаты команды ls отображаются в цвете!

which – определение местоположения выполняемого файла

Иногда в системе имеется более одной версии исполняемой программы. Это довольно редкое явление для настольных систем, но вполне обычное для больших серверов. Точно определить местоположение данного исполняемого файла позволяет команда which:

[me@linuxbox ~]$ which ls

/bin/ls

which ищет только исполняемые программы, она не способна выявлять встроенные команды или псевдонимы, замещающие фактические исполняемые программы. Если попытаться с помощью which определить местоположение встроенной команды (например, cd), мы либо ничего не получим, либо получим сообщение об ошибке:

[me@linuxbox ~]$ which cd

/usr/bin/which: no cd in (/opt/jre1.6.0_03/bin:/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/opt/jre1.6.0_03/bin:/usr/lib/ccache:/usr/local/bin:/usr/bin:/bin:/home/me/bin)

Это своеобразное сообщение «command not found» (команда не найдена).

Получение документации с описанием команд

Теперь, зная тип команды, можно поискать документацию с описанием, доступную для каждого вида команд2.

help – получение справки для встроенных команд

bash имеет встроенную справку для каждой встроенной команды. Чтобы получить ее, введите help с именем встроенной команды. Например:

[me@linuxbox ~]$ help cd

cd: cd [-L|-P] [dir]

Change the current directory to DIR. The variable $HOME is the default DIR. The variable CDPATH defines the search path for the directory containing DIR. Alternative directory names in CDPATH are separated by a colon (:). A null directory name is the same as the current directory, i.e. `.'. If DIR begins with a slash (/), then CDPATH is not used. If the directory is not found, and the shell option `cdable_vars' is set, then try the word as a variable name. If that variable has a value, then cd to the value of that variable. The –P option says to use the physical directory structure instead of following symbolic links; the -L option forces symbolic links to be followed3.

Примечание к форме записи: квадратные скобки в описании синтаксиса команды указывают на необязательность элемента. Вертикальная черта используется для перечисления взаимоисключающих вариантов. В примере с описанием команды cd, приведенном выше, ее синтаксис описывается как cd [-L|-P] [dir].

Эта форма записи говорит, что команда cd может принимать необязательный параметр -L или -P и необязательный аргумент dir.

Несмотря на то что help дает краткое и точное описание команды cd, это описание не может служить инструкцией по использованию, и, как вы можете видеть, в нем упоминается многое из того, чего мы еще не знаем! Но не волнуйтесь, со всем этим мы познакомимся в свое время.

–help – вывод инструкции по использованию

Многие выполняемые программы поддерживают параметр –help для вывода описания синтаксиса и параметров, поддерживаемых командой. Например:

[me@linuxbox ~]$ mkdir –help

Использование: mkdir [КЛЮЧ]... КАТАЛОГ...

Создает КАТАЛОГ(и), если он еще не существует.

  -Z, –context=CONTEXT установить контекст безопасности SELinux для каждого

                     создаваемого каталога равным CTX

Аргументы, обязательные для длинных ключей, обязательны и для коротких.

  -m, –mode=РЕЖИМ   установить код доступа (как в chmod), не a=rwx – umask

  -p, –parents      не выдавать ошибок, если существует, создавать

                     родительские каталоги, если необходимо

  -v, –verbose      печатать сообщение о каждом созданном каталоге

      –help         показать эту справку и выйти

      –version      показать информацию о версии и выйти

Об ошибках в mkdir сообщайте по адресу .

Некоторые программы не поддерживают параметр –help, но вы все равно пробуйте передать его. Часто в результате выводится сообщение об ошибке, содержащее ту же информацию о порядке использования.

man – вывод страниц справочного руководства

Большинство программ, предназначенных для использования в командной строке, предоставляют официальную документацию, которую называют страницей справочного руководства (man-страницу). Для просмотра этих страниц используется специальная программа постраничного просмотра man, например:

man программа

где программа – имя команды.

Страницы справочного руководства могут несколько отличаться друг от друга оформлением, но в общем случае содержат заголовок, краткий обзор синтаксиса команды, описание назначения команды и список всех параметров с их описанием. Однако страницы справочного руководства обычно не включают примеры использования, и их главная цель – служить справочником, а не инструкцией по использованию. Для примера попробуйте вывести страницу справочного руководства для команды ls:

[me@linuxbox ~]$ man ls

В большинстве систем Linux man использует less для вывода страницы, поэтому при просмотре страницы можно использовать все известные команды less.

«Руководство», которое отображает man, разбито на разделы и охватывает не только пользовательские команды, но и команды системного администрирования, программные интерфейсы, форматы файлов и многое другое. В табл. 5.1 перечислены разделы справочного руководства.

Таблица 5.1. Организация справочного руководства

Раздел

Содержит

1

Пользовательские команды

2

Программные интерфейсы системных вызовов в ядре

3

Программные интерфейсы в библиотеке C

4

Специальные файлы, такие как узлы устройств и драйверы

5

Форматы файлов

6

Игры и развлечения, такие как хранители экрана

7

Прочее

8

Команды системного администрирования

Иногда, чтобы найти искомое, нужно заглянуть в конкретный раздел. Это актуально для форматов файлов, названия которых часто совпадают с именами команд. Если номер раздела не указан, man всегда будет возвращать первую найденную страницу, обычно из раздела 1. Ниже приведен пример прямого указания номера раздела:

man раздел искомый_термин

Например:

[me@linuxbox ~]$ man 5 passwd

выведет страницу с описанием формата файла /etc/passwd.

apropos – вывод списка подходящих команд

Кроме того, существует возможность найти страницы справочного руководства для близких совпадений с искомым термином. Несмотря на неточность, этот подход иногда оказывается полезным. Ниже приводится пример поиска страниц справочного руководства по слову floppy:

[me@linuxbox ~]$ apropos floppy

create_floppy_devices (8)  – udev callout to create all possible

                             floppy device based on the CMOS type

fdformat             (8)  – Low-level formats a floppy disk

floppy               (8)  – format floppy disks

gfloppy              (1)  – a simple floppy formatter for the GNOME

mbadblocks           (1)  – tests a floppy disk, and marks the bad

                            blocks in the FAT

mformat              (1)  – add an MSDOS filesystem to a low-level

                            formatted floppy disk4

Первое поле в каждой строке вывода – это имя страницы справочного руководства, а второе поле – номер раздела. Обратите внимание, что команда man с параметром -k действует как apropos.

самая брутальная страница справочного руководства

Как вы могли убедиться, страницы справочного руководства, входящие в состав Linux и других Unix-подобных систем, играют роль справочной документации, но не инструкций по использованию. Многие страницы очень сложно читать, но, как мне кажется, первый приз за сложность можно было бы присудить странице с описанием bash. Работая над книгой, я очень внимательно прочитал эту страницу, чтобы убедиться, что не упустил ни одной важной темы. Когда я ее распечатал, у меня получилось больше 80 страниц чрезвычайно плотного текста, структура которого не имеет никакого смысла для начинающих пользователей.

С другой стороны, эта страница очень точная и краткая и содержит полную информацию. Поэтому почитайте ее, если у вас есть запас терпения, а затем ждите того момента, когда вы сможете читать ее и прочитанное будет наполнено для вас смыслом.

whatis – вывод очень краткого описания команды

Программа whatis выводит имя и однострочное описание из страницы справочного руководства, соответствующей искомому слову:

[me@linuxbox ~]$ whatis ls

ls (1) – выводит содержимое каталога

info – вывод записи из справочного руководства Info

В проекте GNU имеется альтернативное руководство Info, которое часто называют info-страницами. Info-страницы выводятся с помощью программы чтения с подходящим названием info. Info-страницы содержат гиперссылки, подобно веб-страницам. Например:

File: coreutils.info, Node: ls invocation, Next: dir invocation, Up:

Directory listing

10.1 `ls': List directory contents

==================================

The `ls' program lists information about files (of any type, including

directories). Options and file arguments can be intermixed arbitrarily, as

usual.

For non-option command-line arguments that are directories, by default `ls'

lists the contents of directories, not recursively, and omitting files with

names beginning with `.'. For other non-option arguments, by default `ls'

lists just the filename. If no non-option argument is specified, `ls' operates

on the current directory, acting as if it had been invoked with a single

argument of `.'.

By default, the output is sorted alphabetically, according to the

–zz-Info: (coreutils.info.gz)ls invocation, 63 lines –Top–5

Программа info читает info-файлы, организованные в древовидную структуру, каждый из которых содержит отдельную тему. Info-файлы включают гиперссылки, с помощью которых можно перемещаться от узла к узлу. Гиперссылку можно узнать по начальному символу звездочки. Гиперссылки активируются при установке текстового курсора на них и осуществляют переход при нажатии клавиши ENTER.

Чтобы вывести info-страницу, введите команду info и добавьте после нее необязательное имя интересующей программы. В табл. 5.2 перечислены команды, которые можно использовать для управления программой во время чтения info-страницы.

Таблица 5.2. Команды программы info

Команда

Действие

?

Вывести справку

Page Up или Backspace

Вывести предыдущую страницу

Page Down или ПРОБЕЛ

Вывести следующую страницу

n

Вперед (next) – вывести следующий узел

p

Назад (previous) – вывести предыдущий узел

u

Вверх (up) – вывести узел, родительский по отношению к текущему, обычно меню

ENTER

Перейти по гиперссылке, находящейся на позиции курсора

q

Завершить (quit)

Большинство программ из числа обсуждавшихся до сих пор, является частью пакета coreutils проекта GNU, поэтому о них можно получить дополнительную информацию командой

[me@linuxbox ~]$ info coreutils

Она выведет страницу с меню, состоящим из гиперссылок на документацию для каждой программы, входящей в состав пакета coreutils.

README и другие файлы с описанием программ

Многие программные пакеты, установленные в вашей системе, включают файлы с документацией, размещаемые в каталоге /usr/share/doc. Большинство из них имеют простой текстовый формат и могут просматриваться с помощью less. Некоторые файлы имеют формат HTML и могут просматриваться с помощью веб-браузера. Можно также встретить файлы с расширением .gz. Это сжатые файлы, обработанные программой-архиватором gzip. Пакет gzip включает специальную версию less с именем zless, которая выводит содержимое текстовых файлов, сжатых архиватором gzip.

Создание собственных команд с помощью alias

А теперь проведем первый опыт по программированию! У нас есть возможность создавать собственные команды с помощью команды alias. Но прежде чем начать, познакомимся с одной маленькой хитростью командной строки. Она позволяет уместить в одной строке несколько команд, для чего нужно просто отделить их друг от друга точкой с запятой:

команда1; команда2; команда3...

Следующий пример демонстрирует этот прием:

[me@linuxbox ~]$ cd /usr; ls; cd -

bin  games    kerberos  lib64    local  share  tmp

etc  include  lib       libexec  sbin   src

/home/me

[me@linuxbox ~]$

Как видите, мы поместили три команды в одну строку. Первая выполняет переход в каталог /usr, вторая выводит его содержимое, и третья осуществляет возврат в предыдущий каталог (команда cd -), поэтому по завершении мы оказываемся там же, где и были. Давайте теперь с помощью alias превратим эту последовательность в новую команду. Первое, что мы должны сделать, – придумать имя для новой команды. Пусть это будет test. Но прежде чем продолжить, хорошо бы проверить, не занято ли уже имя test. Для этого воспользуемся командой type:

[me@linuxbox ~]$ type test

test встроена в оболочку

Ой! Имя test уже занято. Попробуем foo:

[me@linuxbox ~]$ type foo

bash: type: foo: не найден

Отлично! Имя foo свободно. Теперь создадим наш псевдоним:

[me@linuxbox ~]$ alias foo='cd /usr; ls; cd -'

Обратите внимание на структуру этой команды:

alias имя='строка'

За командой alias следует имя, сразу за которым (то есть без пробелов) следует знак «равно» и строка в кавычках, описывающая действие, присваиваемое имени. После определения псевдонима его можно подставлять везде вместо команды.

Давайте попробуем:

[me@linuxbox ~]$ foo

bin  games    kerberos  lib64    local  share  tmp

etc  include  lib       libexec  sbin   src

/home/me

[me@linuxbox ~]$

Тип псевдонима определяется с помощью команды type:

[me@linuxbox ~]$ type foo

foo является алиасом для `cd /usr; ls; cd -'

А удаляется псевдоним с помощью команды unalias:

[me@linuxbox ~]$ unalias foo

[me@linuxbox ~]$ type foo

bash: type: foo: не найден

Несмотря на то что в этом примере мы постарались не использовать имя существующей команды, иногда это бывает полезно. Часто это делается, чтобы применить наиболее желательные параметры к каждому вызову команды. В примере, приведенном выше, мы видели, что команда ls часто определяется как псевдоним, – это позволяет реализовать вывод информации в цвете:

[me@linuxbox ~]$ type ls

ls является алиасом для `ls –color=tty'

Если вызвать команду alias без аргументов, она выведет список всех псевдонимов в окружении. Ниже приводятся несколько псевдонимов, объявляемых в дистрибутиве Fedora по умолчанию. Попробуйте понять, что они делают:

[me@linuxbox ~]$ alias

alias l.='ls -d .* –color=tty'

alias ll='ls -l –color=tty'

alias ls='ls –color=tty'

Существует одна маленькая проблема, связанная с определением псевдонимов в командной строке. Они исчезают по завершении сеанса работы с командной оболочкой. В одной из последующих глав будет показано, как добавить определения псевдонимов в файлы, чтобы они восстанавливались при каждом запуске командной оболочки, а пока насладимся нашим первым, пусть и крошечным, шагом в мир программирования на языке командной оболочки!

Навестите старых друзей

Теперь, когда мы узнали, как найти документацию с описанием команд, поупражняйтесь самостоятельно и найдите описание всех команд, встретившихся вам в этой книге. Познакомьтесь с их дополнительными параметрами и опробуйте их!

2 Некоторые разделы справки Linux переведены на русский язык, а некоторые – нет. Для переведенных разделов мы будем приводить русский текст, выводимый системой на консоль, для непереведенных – указывать перевод в сносках. – Примеч. ред.

3 Перевод:

Делает указанный каталог DIR текущим. Если каталог DIR не указан, по умолчанию используется значение переменной $HOME. Переменная CDPATH определяет пути поиска каталога, содержащего DIR. Альтернативные имена каталогов в CDPATH отделяются друг от друга двоеточием (:). Пустое имя каталога соответствует текущему каталогу, то есть `.'. Если DIR начинается с символа «слеш» (/), переменная CDPATH не используется. Если каталог не найден и установлен параметр `cdable_vars' командной оболочки, выполняется попытка интерпретировать слово как имя переменной. Если эта переменная имеет значение, тогда команда cd использует значение этой переменной. Параметр –P требует использовать физическую структуру каталогов вместо следования по символическим ссылкам; параметр -L требует следовать по символическим ссылкам.

4 Перевод:

create_floppy_devices (8) – вызов udev для создания всех возможных устройств

                            накопителей на гибких дисках на основе типа CMOS

fdformat              (8) – выполняет низкоуровневое форматирование гибкого диска

floppy                (8) – выполняет форматирование гибких дисков

gfloppy               (1) – простая программа форматирования гибких дисков для GNOME

mbadblocks            (1) – тестирует гибкий диск и помечает плохие

                            блоки в FAT

mformat               (1) – создает файловую систему MSDOS на гибком диске,

                            отформатированном на низком уровне

5 Перевод:

Файл: coreutils.info, Узел: команда ls, Следующий: команда dir, Up:

Содержимое каталога

10.1 `ls’: выводит содержимое каталога

==================================

Программа `ls’ выводит информацию о файлах (любого типа, включая

каталоги). Параметры и аргументы могут смешиваться произвольно, как

обычно.

Для аргументов без параметров, представляющих каталоги, по умолчанию `ls’

выводит содержимое каталогов нерекурсивно и пропускает файлы с именами,

начинающимися с `.’. Для других аргументов без параметров по умолчанию `ls’

выводит только указанный файл. В отсутствие аргументов без параметров `ls’ выводит содержимое текущего каталога, действуя, как если бы была вызвана с единственным аргументом `.’.

По умолчанию вывод сортируется в алфавитном порядке, согласно

–zz-Info: (coreutils.info.gz)команда ls, 63 строки –Top–

6. Перенаправление

В этом уроке мы познакомимся с самой крутой возможностью командной строки: перенаправлением ввода/вывода. Благодаря этой возможности мы сможем перенаправлять ввод и вывод команд из файлов и в файлы, а также составлять из команд целые конвейеры. Для демонстрации этой возможности введем в обиход следующие команды:

• cat – объединяет файлы.

• sort – сортирует строки текста.

• uniq – сообщает о повторяющихся строках или удаляет их.

• wc – выводит число символов перевода строки, слов и байтов в каждом указанном файле.

• grep – находит и выводит строки, соответствующие шаблону.

• head – выводит первые строки из файла.

• tail – выводит последние строки из файла.

• tee – читает данные со стандартного ввода и записывает в стандартный вывод и в файлы.

Стандартный ввод, вывод и вывод ошибок

Многие программы, которыми мы уже пользовались, что-нибудь выводят на консоль. Этот вывод часто делится на два типа. Первый – результаты работы программы, то есть данные, для получения которых создавалась программа. Второй – сообщения о состоянии или об ошибках, извещающие нас о самочувствии программы. Например, если взглянуть на вывод программы ls, можно увидеть, что она выводит на экран результаты своей работы и иногда сообщения об ошибках.

Согласно центральной идее Unix, что «все сущее есть файл», такие программы, как ls, в действительности выводят свои результаты в специальный файл, который называется стандартным выводом (standard output, часто обозначается как stdout), а сообщения о состоянии – в специальный файл стандартный вывод ошибок (standard error, stderr). По умолчанию оба файла, стандартный вывод и стандартный вывод ошибок, связаны с экраном и не сохраняются на диске.

Кроме того, многие программы принимают ввод из специального файла с названием стандартный ввод (standard input, stdin), который по умолчанию связан с клавиатурой.

Механизм перенаправления ввода/вывода позволяет изменять направление вывода и ввода. Обычно вывод осуществляется на экран, а ввод – с клавиатуры, но механизм перенаправления ввода/вывода позволяет изменить этот порядок вещей.

Перенаправление стандартного вывода

Механизм перенаправления ввода/вывода позволяет явно указать, куда должен осуществляться стандартный вывод. Чтобы перенаправить стандартный вывод в другой файл вместо экрана, нужно добавить в команду оператор перенаправления > и имя файла. Где это может пригодиться? Иногда полезно сохранить вывод команды в файл. Например, можно сообщить командной оболочке, что она должна направить вывод команды ls в файл ls-output.txt вместо экрана:

[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt

Здесь мы создали длинный список содержимого файла /usr/bin и отправили результаты в файл ls-output.txt. Давайте исследуем перенаправленный вывод команды:

[me@linuxbox ~]$ ls -l ls-output.txt

–rw-rw-r– 1 me  me  167878 2012-02-01 15:07 ls-output.txt

Неплохой файл получился. Если вывести содержимое ls-output.txt с помощью команды less, можно увидеть, что он действительно содержит результаты работы команды ls:

[me@linuxbox ~]$ less ls-output.txt

Давайте теперь повторим эксперимент с перенаправлением, но с небольшим усложнением: укажем имя несуществующего каталога:

[me@linuxbox ~]$ ls -l /bin/usr > ls-output.txt

ls: невозможно получить доступ к '/bin/usr': Нет такого файла или каталога

Мы получили сообщение об ошибке. Все логично – мы указали несуществующий каталог /bin/usr, но почему же сообщение появилось на экране, а не было перенаправлено в файл ls-output.txt? Дело в том, что программа ls не выводит сообщения об ошибках в стандартный вывод. Как и многие добропорядочные программы для Unix, она выводит сообщения об ошибках в стандартный поток вывода ошибок. Поскольку мы перенаправили только стандартный вывод, а стандартный вывод ошибок – нет, сообщение об ошибке появилось на экране. Как перенаправить стандартный вывод ошибок, будет показано чуть ниже, но перед этим посмотрим, что произошло с нашим файлом:

[me@linuxbox ~]$ ls -l ls-output.txt

–rw-rw-r– 1 me me 0 2012-02-01 15:08 ls-output.txt

Файл очистился! Это объясняется тем, что при перенаправлении вывода с помощью оператора > файл назначения всегда перезаписывается с самого начала. Поскольку команда ls не вывела никаких результатов, а только сообщение об ошибке, оператор перенаправления перезаписал файл, а затем остановился из-за ошибки, что привело к его очистке. Получается, что если вам понадобится очистить какой-нибудь файл (или создать новый, пустой файл), это можно сделать с помощью следующего трюка:

[me@linuxbox ~]$ > ls-output.txt

Простой оператор перенаправления, без предшествующей ему команды, очистит существующий файл или создаст новый, пустой файл.

Так как же добавить вывод в конец существующего файлa, не затерев его? Для этого используем оператор перенаправления >>:

[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt

Оператор >> просто добавит результаты в конец файла. Если файл не существует, он будет создан, как при использовании оператора >. Давайте протестируем его:

[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt

[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt

[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt

[me@linuxbox ~]$ ls -l ls-output.txt

–rw-rw-r– 1 me  me 503634 2012-02-01 15:45 ls-output.txt

Мы повторили команду трижды и получили файл втрое большего размера.

Перенаправление стандартного вывода ошибок

Перенаправление стандартного вывода ошибок осуществляется не так просто, как стандартного вывода. Чтобы перенаправить стандартный вывод ошибок, нужно указать его дескриптор файла. Программа может производить вывод в любой из нескольких нумерованных файловых потоков. Первые три из них мы упомянули как стандартный ввод, вывод и вывод ошибок. Командная оболочка ссылается на них как на файловые дескрипторы 0, 1 и 2 соответственно. Командная оболочка поддерживает синтаксис перенаправления файлов с использованием номеров файловых дескрипторов. Так как стандартному выводу ошибок соответствует файловый дескриптор 2, мы можем перенаправить его, как показано ниже:

[me@linuxbox ~]$ ls -l /bin/usr 2> ls-error.txt

Номер файлового дескриптора 2 помещается непосредственно перед оператором перенаправления, чтобы перенаправить стандартный вывод ошибок в файл ls-error.txt.

Перенаправление стандартного вывода и стандартного вывода ошибок в один файл

Иногда необходимо сохранить весь вывод команды в один файл. Для этого перенаправьте сразу два потока, стандартный вывод и стандартный вывод ошибок. Сделать это можно двумя способами. Первый  – традиционный – работает в старых версиях командной оболочки:

[me@linuxbox ~]$ ls -l /bin/usr > ls-output.txt 2>&1

Здесь выполняется два перенаправления. Сначала – перенаправление стандартного вывода в файл ls-output.txt, а затем, с использованием нотации 2>&1, – перенаправление файлового дескриптора 2 (стандартный вывод ошибок) в файловый дескриптор 1 (стандартный вывод).

ПРИМЕЧАНИЕ

Имейте в виду, что порядок перенаправления играет важную роль. Перенаправление стандартного вывода ошибок всегда должно производиться после перенаправления стандартного вывода, иначе этот трюк не сработает. В примере, приведенном выше, последовательность > ls-output.txt 2>&1 перенаправит стандартный вывод ошибок в файл ls-output.txt, но если порядок перенаправления изменить на 2>&1 > ls-output.txt, стандартный вывод ошибок будет перенаправлен на экран.

Современные версии bash поддерживают второй, более простой метод выполнения перенаправления этого вида:

[me@linuxbox ~]$ ls -l /bin/usr &> ls-output.txt

В данном примере используется единственный оператор &>, перенаправляющий стандартный вывод и стандартный вывод ошибок в файл ls-output.txt.

Удаление нежелательного вывода

Иногда молчание действительно золото, и вывод команды нужно отбросить. В особенности это касается служебных сообщений и сообщений об ошибках. Система дает такую возможность, предоставляя специальный файл /dev/null, куда можно перенаправить вывод. Этот файл представляет системное устройство, называемое битоприемником (bit bucket), или мусорной корзиной, которое принимает любой ввод и ничего с ним не делает. Чтобы подавить вывод сообщений об ошибках, достаточно проделать следующее:

[me@linuxbox ~]$ ls -l /bin/usr 2> /dev/null

/DEV/NULL в культуре unix

«Битоприемник» – старое понятие в Unix, благодаря своему универсализму широко используется в культуре Unix. Так, когда кто-то скажет, что посылает ваши комментарии в «dev null», вы теперь будете знать, что это означает. Еще больше примеров вы найдете в статье Википедии https://ru.wikipedia.org/wiki//dev/null.

Перенаправление стандартного ввода

До сих пор нам не встречались команды, использующие стандартный ввод (на самом деле они встречались, но мы подробнее обсудим их чуть ниже), поэтому нам нужно познакомиться с ними.

cat – объединение файлов

Команда cat читает содержимое одного или нескольких файлов и копирует его в стандартный вывод:

cat [файл...]

Часто команду cat можно считать аналогом команды TYPE в DOS. Она используется для вывода содержимого файлов без возможности постраничного просмотра. Например,

[me@linuxbox ~]$ cat ls-output.txt

выведет содержимое файла ls-output.txt. Команда cat часто используется для вывода коротких текстовых файлов. Поскольку cat способна принимать сразу несколько файлов, она используется для их объединения. Представьте, что вы загрузили большой файл, разбитый на множество частей (в Usenet мультимедийные файлы часто разбиваются таким способом), и требуется объединить их в один файл. Если файлы имеют имена, такие как

movie.mpeg.001 movie.mpeg.002 ... movie.mpeg.099

их можно объединить следующей командой:

[me@linuxbox ~]$ cat movie.mpeg.0* > movie.mpeg

Поскольку подстановка фактических имен взамен групповых символов всегда выполняется в порядке сортировки, аргументы окажутся расположенными в правильном порядке.

Все это прекрасно, но при чем здесь стандартный ввод? Пока ни при чем, но давайте попробуем кое-что еще. Что получится, если вызвать cat без аргументов?

[me@linuxbox ~]$ cat

Ничего не произошло – такое ощущение, что команда зависла. Однако в действительности команда делает именно то, что и предполагалось.

Если вызвать cat без аргументов, она начнет читать данные со стандартного ввода, а поскольку стандартный ввод по умолчанию подключен к клавиатуре, получается, что команда ждет, пока вы что-нибудь напечатаете!

Попробуйте так:

[me@linuxbox ~]$ cat

Съешь ещё этих мягких французских булок, да выпей чаю.

Затем нажмите комбинацию CTRL-D (то есть, удерживая нажатой клавишу CTRL, нажмите клавишу D), чтобы сообщить команде cat, что достигнут конец файла (end-of-file, EOF) на стандартном вводе:


    Ваша оценка произведения:

Популярные книги за неделю