Воскресенье, 19.05.2024, 10:16
Приветствую Вас Гость | RSS
Мой сайт
Главная
Регистрация
Вход
Форма входа

Меню сайта

Категории раздела
Об ОС Windows [137]
В категории размещаются статьи, касающщиеся операционных систем от Microsoft.
Об ОС *Nix [198]
В данной категории собраны статьи об ОС семейства Unix/Linux/FreeBSD/...
Справочные материалы [351]
Справка по всему разделу.
Виртуализация и Облака [46]
Networks & Routing [86]
DataBases [22]

Наш опрос
Оцените мой сайт
Всего ответов: 209

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » Статьи » Системное администрирование » Об ОС *Nix

Ввод и вывод в терминале linux

Ввод и вывод в терминале linux

Терминал shell-оболочки bash, используемой по умолчанию во многих дистрибутивах linux, обладает развитыми средствами перенаправления потоков ввода и вывода. В этой статье собраны некоторые основные приёмы их использования.

  1. Стандартные поток ввода (stdin) и стандартные потоки вывода (stdout) и ошибок (stderr).
  2. Код завершения выполнения программы.
  3. Перенаправление вывода команды в файл.
  4. Перенаправление ввода команды из файла.
  5. Перенаправление вывода команды на ввод другой команды.
  6. Перенаправление вывода в никуда.
  7. Именованые каналы.
  8. Перенаправление вывода в несколько файлов.
  9. Перенаправление вывода на другой терминал.
  10. Вывод содержимого файла.
  11. Ввод из командной строки в файл.
  12. Выполнение команд из файла.
  13. Вывод управлящих символов и символов по кодам.
  14. Запуск сессии shell с перенаправлением стандартных потоков.
  15. Замена символов при выводе.
  16. Построчное объединение файлов.

1. Стандартные поток ввода (stdin) и стандартные потоки вывода (stdout) и ошибок (stderr).

Операционная система linux написана на языке программирования C, в котором по умолчанию открыты три файловых дескриптора, имеющих следующие значения:
  • 1 (stdin) стандартный поток ввода. Из этого потока программа может читать данные.
  • 2 (stdout) стандартный поток вывода. В этот поток программа может выводить данные.
  • 3 (stderr) стандартный поток ошибок. В этот поток программа может выводит сообщения об ошибках.
В shell-оболочке bash стандартный поток ввода stdin соответственно имеет номер 1, а потоки вывода номера 1 для stdout и 2 для stderr.
При запуске shell, например при логине или при запуске командой sh, открывается новая shell-сессия, внутри которой создаются псевдофайлы символьных ссылок на устройства ввода-вывода /dev/stdin, /dev/stdout и /dev/stderr, в которые потоки ввода-вывода можно перенаправлять так же, как в обычные текстовые файлы.

2. Код завершения выполнения программы

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

mkdir -p mydir1 ; cp myfile1 ./mydir1/ && rm ./myfile1

Данная команда создаёт в текущем каталоге подкаталог с названием mydir1, копирует файл с названием myfile1 из текущего каталога в подкаталог mydir1 и если копирование прошло успешно, удаляет копию файла myfile1 в текущем каталоге. Ключ -p в команде mkdir используется для того, чтобы команда mkdir не выдавала сообщение об ошибке в случае, если каталог mydir1 уже существует.

3. Перенаправление вывода команды в файл.

Для перенаправления вывода команды в файл используется запись вида >имя_файла или >>имя_файла. Например:

echo "Однажды, в студёную зимнюю пору" >poetry.txt
echo "Я из лесу вышел, был сильный мороз." >>poetry.txt

Первая команда создаст в текущем каталоге файл с названием poetry.txt (либо, если файл с таким названием уже существует, удалит его и создаст новый файл с таким названием)  и запишет в этот файл строку текста, являющуюся первой строкой стихотворения.
Вторая команда, если файл с названием poetry.txt не существует, создаст такой файл, а если файл существует, то откроет его для записи, и запишет в его конец вторую строку стихотворения.
Посмотреть содержимое файла можно командой

cat poetry.txt

Чтобы вывести в файл сообщения об ошибках, используется запись вида 2>имя_файла и 2>>имя_файла соответственно, где 2 - это номер стандартного потока ошибок stderr.

Таким образом, вывод программы можно, например, перенаправить в один файл, а сообщения
об ошибках  - в другой файл. Например:

(find /etc | grep local) >tmp.out 2>tmp.err

И наоборот - для того, чтобы вывод из обоих потоков перенаправить в один файл используется запись вида &>имя_файла или &>>имя_файла.

Чтобы указать в качестве имени файла один из этих потоков, используется запись вида 1>&2 или 2>&1.

4. Перенаправление ввода команды из файла.

Для того, чтобы взять содержимое текстового файла в качестве ввода для команды, используется запись вида <имя_файла.

Кроме того, некоторые команды, например cat или awk, используют знак минус как специальное имя для обозначения стандартного потока ввода.

5. Перенаправление вывода команды на ввод другой команды.

Для перенаправления вывода команды на ввод другой команды используется механизм каналов. Для этого две команды объединяются при помощи символа вертикальной черты |. На клавиатуре PC этот символ расположен рядом с клавишей "забой" (Backspace), что расположена над клавишей "ввод" (Enter).
Например:

find /etc 2>/dev/null | grep local

Команда find /etc 2>/dev/null выведет список всех файлов и каталогов в каталоге /etc и всех файлов в подкаталогах каталога /etc. Вывод сообщений об ошибках этой команды будет перенаправлен на так называемое нулевое устройство, то будет выведен в никуда.
Вывод этой команды перенаправляется на вход канала, выход которого соединяется с потоком ввода команды grep local.
Команда grep local отфильтрует данные потока ввода и выведет только те строки, которые содержат local.

6. Перенаправление вывода в никуда

Чтобы перенаправить поток вывода в никуда, используется специальный файл устройства /dev/null. Например, следующая команда может быть использована для поиска в файловой системе файла с названием имя_файла, при этом сообщения об ошибках выводиться на экран не будут.

find / | grep имя_файла 2>/dev/null

7. Именованые каналы.

Канал также можно создать, подобно файлу или каталогу, и присвоить ему название, для того, чтобы перенаправлять в него вывод нескольких команд. Такие каналы называются именованными каналами или pipes.
Чтобы создать именованный канал используется команда mkfifo либо команда mknod с типом файла p. Например:

mkfifo mypipe1
mknod mypipe2 p

Первая команда создаст в текущем каталоге именованный канал с названием mypipe1, вторая - именованный канал с названием mypipe2.
Попробуем использовать канал mypipe1 для поиска файлов в каталогах /usr/share и /usr/local/share файлов и каталогов в названии которых встречается font.

find /usr/share >mypipe1 &
find /usr/local/share >mypipe1 &
cat mypipe1 | grep font | less

Вывод первых двух команд перенаправляется в именованный канал mypipe1. При этом обе команды запускаются на исполнение в фоновом режиме. Это делается с помощью символа & в конце строки.
Третья команда состоит из трёх команд, вывод которых перенаправляется в поток ввода следующей команды:
  • Команда cat mypipe1 выводит содержимое файла, в данном случае это именованный канал mypipe1.
  • Команда grep font выводит только строки, содержащие font.
  • Команда less испольуется для того, чтобы вывод можно было удобно просматривать. Завершение работы команды less - клавиша q.
У именованных каналов есть одно ограничение. Мы можем перенаправить в именованный канал вывод нескольких команд, но лишь одна команда может читать данные из именованного канала.

8. Перенаправление вывода в несколько файлов.

Чтобы перенаправить вывод команды в несколько файлов используется команда tee.  Эта команда выводит данные из потока ввода в поток вывода и дублирует эти данные в указанные файлы. Например:

echo "Тест команды tee." | tee file1 file2

Эта команда выведет строку "Тест команды tee." на терминал и в файлы file1 и file2.

9. Перенаправление вывода на другой терминал.

Для перенаправления вывода на другой терминал, в linux используются псевдотерминалы. При открытии новой текстовой консоли, создаётся специальный файл устройства в директории /dev/pts с названием файла в виде порядкового номера псевдотерминала. Перенаправив вывод программы в файл выбранного псевдотерминала, можно отделить, например, сообщения об ошибках исполняемой программы от вывода stdout. Например:

echo "Вывод на псевдотерминал №0." >/dev/pts/0
find /etc 2>/dev/pts/0 | grep xxxx >/dev/pts/1


Подробнее о псевдотерминалах см. man pty и man pts.

10. Вывод содержимого файла.

Чтобы вывести содержимое файла на терминал, используется утилита cat:

cat myfile.txt

Если файл достаточно большой, то его содержимое удобно просматривать постранично, подобно справочным страницам man. Это делается с помощью утилиты less (выход из режима просмотра - клавиша Q):

cat README | less

Чтобы просмотреть дамп бинарного файла, используется утилита hex:

hex `which hex` | less

Данная команда предоставляет постраничный просмотр дампа бинарного файла самой утилиты hex, путь к которой определяется утилитой which.

11. Ввод из командной строки в файл.

Для быстрого создания текстового файла можно воспользоваться средствами утилиты cat, выводящей содержимое файла на терминал:

cat - >myfile.txt

Завершение редактирования осуществляется вводом символа EOF (End Of File - конец файла). Чтобы ввести символ EOF, следует нажать клавиши Ctrl+D.

12. Выполнение команд из файла.

Для того, чтобы выполнить команды, записанные в текстовый файл, можно запустить из командной строки оболочку shell, указав ей в качестве аргумента имя файла. Например:

cat - >myscript.sh
#!/bin/sh

ls -l

echo "Hello, World!"
# Нажмите Ctrl+D, чтобы завершить ввод в файл myscript.sh
sh myscript.sh

В данном примере будет создан текстовый файл, представляющий собою shell-скрипт, содержащий две команды. Первая выводит на терминал содержимое текущего каталога, а вторая выводит на терминал надпись "Hello, World!".
Первой строкой файла является запись комментария в специальном формате, которая указывает командной оболочке shell путь к интерпретатору содержимого файла, и таким образом, этот скрипт можно сделать исполняемым файлом, добавив в его свойства атрибут x:

chmod +x myscript.sh
./myscript.sh


Командой sh myscript.sh запускается командная оболочка shell, которой в качестве аргумента указан файл скрипта myscript.sh.

13. Вывод управляющих символов и символов по кодам.

Каждому символу соответствует определённый код, например - код ASCII. И соответственно символы можно выводить, используя соответствующие им коды. Например:

echo -e "\x48 \x65 \x6C \x6C \x6F \x21"

Эта команда выведет на терминал строку "H e l l o !". Я намеренно вставил пробелы между кодами символов для лучшей читаемости. Каждый символ представлен своим ASCII-кодом в шестандцатеричном виде. Ключ -e команды echo нужен для того, чтобы задействовать при выводе распознавание управляющих символов.
Для вывода символов по кодам в восьмеричном виде используется запись символа вида \0Z, где Z - это восьмеричный код символа в диапазоне от 0 до 177. Например, вывод строки "H e l l o !" в восьмеричных кодах:

echo -e "\0110 \0145 \0154 \0154 \0157 \041"

Таким образом можно выводить на терминал управляющие последовательности. Например, символ табуляции \t или символ перевода строки \n.

echo -e "\tОднажды, в студённую зимнюю пору\n\tЯ из лесу вышел, был сильный мороз..."

А также для вывода управляющих последовательностей эмулируемого терминала. Например в режиме эмуляции терминала VT-100, следующая команда очистит экран:

echo -en "\033c"

С помощью ключа -n команды echo при выводе строки на терминал не будет добавлен символ перевода строки \n.

14. Запуск сессии shell с перенаправлением стандартных потоков.

Новая сессию shell можно запустить из командной строки также, как любую другую команду. Это делается с помощью команды sh.

Чтобы завершить сессию используется команда exit.

При запуске новой shell-сессии можно перенаправить поток вывода команды на поток ввода stdin новой сессии. При этом, когда перенаправленный поток будет завершён, сессия будет завершена. Например:

echo "ls -l /dev/fd/" | sh

Данная команда запускает новую сессию shell, в которой будет выполнена команда, выводящая на терминал информацию о псевдофайлах символьных ссылок на стандартные потоки ввода-вывода.

При этом можно перенаправить, например, вывод ошибок всех команд, выполняемых в новой сессии, в файл:

echo "ls -l /dev/fd/" | sh 2>errors.log

15. Замена символов при выводе.

Для замены символов в тексте, выводимом на терминал, используется команда tr. Например:

echo -e "мама\nпапа" | tr мп пм

С помощью данной команды при выводе строки символы м и п будут заменены символами п и м соответственно, и таким образом вместо

мама
папа

будет выведено

папа
мама

Для того, чтобы символы при выводе не заменить, а удалить, при вызове  tr используется ключ -d:

echo -e "абра\nкад\nабра" | tr -d "\n"

Данная команда выводит строку, из которой при выводе удаляются символы переноса строки.

16. Построчное объединение файлов.

Иногда возникает необходимость обработать с помощью одного скрипта строки из нескольких файлов. Проще всего это сделать, предварительно объединив обрабатываемые файлы построчно. Это делается с помощью команды paste. Например:

ls -1 ~ >file1.txt
ls -1 /etc >file2.txt
paste file1.txt file2.txt | awk '/e/{print};' -

Данная последовательность команд создаёт в текущем каталоге два файла с названиями file1.txt и file2.txt. Затем выводит их содержимое, объединяя их построчно с разделителем по умолчанию (символ табуляции), и вывод перенаправляется на стандартный ввод скрипта на языке интерпретатора AWK, который выводит все строки, содержащие латинскую букву e.

Для того, чтобы использовать другой символ в качестве разделителя, команда paste вызывается с ключом -d:

paste -d"\n" file1.txt file2.txt | awk '/e/{print};' -

В данной команде те же файлы будут объединены с использованием в качестве разделителя символа переноса строки, то есть так:

Источник: http://sites.google.com/site/vanyambauseslinux/home/vvod-i-vyvod-v-terminale
Категория: Об ОС *Nix | Добавил: admin (29.06.2011)
Просмотров: 5811 | Теги: перенаправление, stdin, stderr, Ввод и вывод, stdout | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Поиск

Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz


  • Copyright MyCorp © 2024