SlideShare a Scribd company logo
Часть 4. Именованные каналы (pipes)
Перенаправление команд и pipes
Использование перенаправления команд и pipes — одна из наиболее мощных возможностей командной строки Unix. В
этой главе мы рассмотрим как и для чего используется перенаправление потоков ввода, вывода и ошибок, а также
рассмотрим что такое pipes и как это работает.
stdin, stdout, и stderr
Shell (а также почти все команды Linux) принимает ввод команд из стандартного потока ввода stdin (поток 0) и
отправляет вывод на стандартный поток вывода stdout (поток 1). Если команды завершаются с ошибками, то сообщения
об ошибках отправляются в стандартный поток ошибок stderr (поток 2).
Например, вы вводите команду echo Hello в консоли и нажимаете Enter (поток stdin), далее, вы видите на экране
результат ее работы — Hello (поток stdout). Если возникла ошибка, то на экран выводится какое-то сообщение (поток
stderr). В нашем примере мы работали со стандартным вводом, выводом и потоком ошибок, то есть набирали команду на
клавиатуре, результаты видели на экране, ошибки также выводились на экран.
В Unix есть возможность перенаправлять эти потоки. Например, вам нужно, чтобы результат работы команды
отправлялся не на экран а в файл или чтобы ошибки отправлялись на e-mail и т. д. Такие ситуации в администрировании
возникают постоянно. Это и есть перенаправление команд.
Перенаправление стандартного вывода
Рассмотрим перенаправление более подробно. В следующем примере stdout перенаправляется с помощью знака
больше >:
$ echo Hello world!
Hello world!
$ echo Hello world! > hello.txt
$ cat hello.txt
Hello world!
В этом примере мы перенаправляем stdout в файл. При этом создается новый файл, если его не было или полностью
перезаписывается, если он уже был создан.
Обратите внимание, что запись > на самом деле является аббревиатурой от 1> (stdout называется поток 1).
Даже если команда закончится с ошибкой файл все равно будет перезаписан! Будте внимательны при перенаправлении
stdin в файл!
$ cat hello.txt
Hello world!
$ zcho Hello world! > hello.txt
-bash: zcho: command not found
$ cat hello.txt
$
Можно предотвратить перезапись файла при использовании 1> с помощью опции noclobber:
$ cat hello.txt
Hello world!
$ set -o noclobber
$ echo Hello world! > hello.txt
-bash: hello.txt: cannot overwrite existing file
$ set +o noclobber
$
В тоже время опцию noclobber можно «обойти», используя >| вместо >:
1
$ set -o noclobber
$ echo Hello world! > hello.txt
-bash: hello.txt: cannot overwrite existing file
$ echo Hello world! >| hello.txt
$ cat hello.txt
Hello world!
$
Если вам нужно добавить stdout в файл и при этом не перезаписать его, то используйте >>:
$ echo Hello world! > hello.txt
$ cat hello.txt
Hello world!
$ echo Hello Linux! >> hello.txt
$ cat hello.txt
Hello world!
Hello Linux!
$
Перенаправление ошибок
Перенаправление потока ошибок выполняется с помощью 2>. Это делается достаточно часто, например, чтобы не
«засорять» экран сообщениями об ошибках. В следующем примере перенаправляется stdout в файл и stderr на
устройство /dev/null (вспомним, что /dev/null — это «черная дыра», а также, что 1> и > выполняют одно и тоже):
$ find / > allfiles.txt 2> /dev/null
$
Чтобы перенаправить в один файл и stdout и stderr можно использовать 2>&1:
$ find / > allfiles_and_errors.txt 2>&1
$
Обратите внимание, важно в каком порядке выполняется перенаправление! Так, в следующем примере:
ls > file.txt 2>&1
направляет и stdout (1) и stderr (2) в файл file.txt, а команда:
ls 2>&1 > file.txt
направляет только stdout в файл file.txt, а stderr просто копируется на stdout до того, как stdout был перенаправлен в
файл. Пока это может показаться сложным, но, используя перенаправление на практике вы поймете этот механизм
лучше.
Перенаправление стандартного ввода
Перенаправление stdin выполняется с помощью < (полная запись 0<):
$ cat < text.txt
one
two
$ tr 'onetw' 'ONEZZ' < text.txt
ONE
ZZO
$
Существует способ (называется here document или here-is-document), чтобы выполнять перенаправление stdin до
определенной последовательности символов (обычно это маркер EOF). Маркер EOF можно ввести прямо с клавиатуры
или вставить комбинацией Ctrl-D:
2
$ cat <<EOF > text.txt
> one
> two
> EOF
$ cat text.txt
one
two
$ cat <<brol > text.txt
> brel
> brol
$ cat text.txt
brel
$
Запутанное перенаправление
Перед перенаправлением shell сканирует командную строкудо конца. Следующая команда легко читаема и абсолютно
корректна:
cat one.txt > two.txt 2> errors.txt
В следующем примере команда также абсолютно корректна, но уже менее читабельна:
2> errors.txt cat one.txt > two.txt
И даже эта команда будет корректна:
< one.txt > two.txt 2> errors.txt cat
Как быстро очистить файл
Как удалить всю информацию из файла самым быстрым способом?
> file.txt
А если нужно очистить файл при включенной опции noclobber:
>| file.txt
Перенаправление stdout на stderr
При фильтрации выходного потока, например, через обычный pipe (|) можно только фильтровать stdouot. Допустим, вы
хотите отфильтровать некоторые малозначительные ошибки, из потока stderr. Этого нельзя сделать напрямую, поэтому
вам нужно организовать обмен ("swap") между stdout и stderr:
3>&1 1>&2 2>&3
В этой конструкции мы используем временный поток 3, чтобы организовать обмен между stdout (1) и stderr (2). В
следующем примере показано как отфильтровать из потока ошибок stderr все, что совпадает со значением переменной
$error:
$command 3>&1 1>&2 2>&3 | grep -v $error 3>&1 1>&2 2>&3
Но, этот способ не самый лучший. В следующем примере мы делаем то же самое используя pipe:
/usr/bin/$command | & grep -v $error
Pipes. Использование |
Одно из самых мощных преимуществ Linux является использование pipes — именованных каналов. Pipes мспользуется
для обмена данными между приложениями (от ангийского pipe – труба).
Pipe берет стандартный вывод stdout предыдущей команды и перенаправляет его на стандартный ввод stdin следующей
3
команды. Все команды в pipe выполняться одновременно.
Рассмотрим следующий пример:
$ ls /etc > etcfiles.txt
$ tail -4 etcfiles.txt
X11
xdg
xml
xpdf
Здесь мы перенаправляем вывод команды ls (содержимое каталога /etc) в файл etcfiles.txt и выводим на экран последние
4 строки этого файла. Для выполнения задачи нам потребовалось ввести 2 команды. То же самое можно выполнить
одной командой, используя pipe:
$ ls /etc | tail -4
X11
xdg
xml
xpdf
Чтобы создать pipe нужно между командами вставить |. Как видите, все достаточно просто.
В одной командной строке можно использовать несколько pipes. В этом случае все команды также будут выполнены
одновременно:
$ ls /etc | tail -4 | tac
xpdf
xml
xdg
X11
4
Практика: Перенаправление команд и pipes
Задания:
1. Используя ls вывестиь содержимое каталога /etc в файл etc.txt.
2. Включить опцию noclobber.
3. Убедитесь, что опция nocclobber включена, для этого попробуйте повторить задание 1.
4. Если вывести все опции shell, каким образом будет отображаться опция noclobber?
5. Отключите опцию noclobber.
6. Откройте второй shell. В первом shell создайте пустой файл tailing.txt. Затем выполните команду tail -f
tailing.txt. Перейдите во второй shell и добавьте произвольную строку текста в этот файл. Вернитесь в первый
shell и убедитесь, что в нем эта строка также отображается.
7. Создайте файл, содержащий имена и фамилии пяти человек. Для этого используйте команду cat и
перенаправление стандартного вывода, чтобы создать пустой файл, а также here document (EOF) чтобы
закончить ввод имен.
Ответы:
1. ls /etc > etc.txt
2. set -o noclobber
3. ls /etc > etc.txt (должно быть сообщение об ошибке)
4. echo $- (опция noclobber выводится как C)
5. set +o noclobber
6. В первом shell:
$ > tailing.txt
$ tail -f tailing.txt
hello
world
Во втором shell:
$ echo hello >> tailing.txt
$ echo world >> tailing.txt
7. $ cat > names.txt << EOF
> Igor Petrov
> Andrey Ivanov
> Elena Andreeva
> Olga Stepanova
> Ilya Nikitin
> EOF
$ cat names.txt
Igor Petrov
Andrey Ivanov
Elena Andreeva
Olga Stepanova
Ilya Nikitin
5

More Related Content

What's hot

Linux basics. Занятие 3.
Linux basics. Занятие 3. Linux basics. Занятие 3.
Linux basics. Занятие 3.
Vikentsi Lapa
 
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Ontico
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?tfmailru
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
RAMBLER&Co
 
Кеширование. Api. http 1.1 (rfc 2616)
Кеширование. Api. http 1.1 (rfc 2616)Кеширование. Api. http 1.1 (rfc 2616)
Кеширование. Api. http 1.1 (rfc 2616)
Artjoker
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?tfmailru
 
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Ontico
 
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Badoo Development
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Noveo
 
file handling in c
file handling in cfile handling in c
file handling in c
Maxim Shaptala
 
Уязвимости сервисов
Уязвимости сервисовУязвимости сервисов
Уязвимости сервисовPositive Hack Days
 
08 linux-course
08 linux-course08 linux-course
08 linux-course
Vikentsi Lapa
 
"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27
MoscowJS
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
Yandex
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
Ontico
 
Coroutines
CoroutinesCoroutines
Coroutines
Aleksandr Mokrov
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Noveo
 

What's hot (20)

Linux basics. Занятие 3.
Linux basics. Занятие 3. Linux basics. Занятие 3.
Linux basics. Занятие 3.
 
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
Кеширование. Api. http 1.1 (rfc 2616)
Кеширование. Api. http 1.1 (rfc 2616)Кеширование. Api. http 1.1 (rfc 2616)
Кеширование. Api. http 1.1 (rfc 2616)
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
 
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
 
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 
Nio java
Nio javaNio java
Nio java
 
file handling in c
file handling in cfile handling in c
file handling in c
 
Уязвимости сервисов
Уязвимости сервисовУязвимости сервисов
Уязвимости сервисов
 
08 linux-course
08 linux-course08 linux-course
08 linux-course
 
"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
работа с файлами в с++
работа с файлами в с++работа с файлами в с++
работа с файлами в с++
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
 
Coroutines
CoroutinesCoroutines
Coroutines
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
Tarantool_qs
 Tarantool_qs Tarantool_qs
Tarantool_qs
 

Viewers also liked

Credo religioso
Credo religiosoCredo religioso
Credo religioso
Jhonatan Rosero Gomez
 
TIC
TICTIC
TIC
nacha4s
 
Hany Salah last update C.V
Hany Salah last update C.VHany Salah last update C.V
Hany Salah last update C.V
hany salah
 
FimH ADHESIN
FimH ADHESINFimH ADHESIN
Hany Salah last update C.V
Hany Salah last update C.VHany Salah last update C.V
Hany Salah last update C.V
hany salah
 
Yasser_CV
Yasser_CVYasser_CV
Yasser_CV
Yasser Gamal
 
Alex-2014-2015-Brochure.compressed(2)
Alex-2014-2015-Brochure.compressed(2)Alex-2014-2015-Brochure.compressed(2)
Alex-2014-2015-Brochure.compressed(2)
Andrea Rosales
 
Project 2016
Project 2016Project 2016
Project 2016
Chad Clark
 
Helix product overview
Helix product overviewHelix product overview
Helix product overview
PHILIPPE CORNETTE
 
Presentación2
Presentación2Presentación2
Presentación2
johana ortiz
 
Mortificación de la mente y de la voluntad
Mortificación de la mente y de la voluntadMortificación de la mente y de la voluntad
Mortificación de la mente y de la voluntad
Famvin: the Worldwide Vincentian Family
 

Viewers also liked (11)

Credo religioso
Credo religiosoCredo religioso
Credo religioso
 
TIC
TICTIC
TIC
 
Hany Salah last update C.V
Hany Salah last update C.VHany Salah last update C.V
Hany Salah last update C.V
 
FimH ADHESIN
FimH ADHESINFimH ADHESIN
FimH ADHESIN
 
Hany Salah last update C.V
Hany Salah last update C.VHany Salah last update C.V
Hany Salah last update C.V
 
Yasser_CV
Yasser_CVYasser_CV
Yasser_CV
 
Alex-2014-2015-Brochure.compressed(2)
Alex-2014-2015-Brochure.compressed(2)Alex-2014-2015-Brochure.compressed(2)
Alex-2014-2015-Brochure.compressed(2)
 
Project 2016
Project 2016Project 2016
Project 2016
 
Helix product overview
Helix product overviewHelix product overview
Helix product overview
 
Presentación2
Presentación2Presentación2
Presentación2
 
Mortificación de la mente y de la voluntad
Mortificación de la mente y de la voluntadMortificación de la mente y de la voluntad
Mortificación de la mente y de la voluntad
 

Similar to Linux (pipes)

Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GIL
Roman Brovko
 
Текст.pptx
Текст.pptxТекст.pptx
Текст.pptx
TalgatAmantaev
 
лекция 2
лекция 2лекция 2
лекция 2
Alexander Babich
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2Technopark
 
системное администрирование
системное администрированиесистемное администрирование
системное администрированиеsplinter408
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3it-people
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bashkuchinskaya
 
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
Alexey Paznikov
 
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla Systems Inc.
 
Hf labs education day. rocket science
Hf labs education day. rocket scienceHf labs education day. rocket science
Hf labs education day. rocket science
Olga Kiseleva
 
Threads in java
Threads in javaThreads in java
Threads in java
Asya Dudnik
 
Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)
Alex Ott
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
Alexander Podkhalyuzin
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобов
Lidiya Myalkina
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
Platonov Sergey
 
1 вводное занятие
1 вводное занятие1 вводное занятие
1 вводное занятие
luis_blanco_rau
 

Similar to Linux (pipes) (20)

Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GIL
 
Step 7
Step 7Step 7
Step 7
 
Текст.pptx
Текст.pptxТекст.pptx
Текст.pptx
 
лекция 2
лекция 2лекция 2
лекция 2
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
системное администрирование
системное администрированиесистемное администрирование
системное администрирование
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bash
 
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
 
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
 
Hf labs education day. rocket science
Hf labs education day. rocket scienceHf labs education day. rocket science
Hf labs education day. rocket science
 
Threads in java
Threads in javaThreads in java
Threads in java
 
Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)
 
Ngs 1 2
Ngs 1 2Ngs 1 2
Ngs 1 2
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобов
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
1 вводное занятие
1 вводное занятие1 вводное занятие
1 вводное занятие
 

Linux (pipes)

  • 1. Часть 4. Именованные каналы (pipes) Перенаправление команд и pipes Использование перенаправления команд и pipes — одна из наиболее мощных возможностей командной строки Unix. В этой главе мы рассмотрим как и для чего используется перенаправление потоков ввода, вывода и ошибок, а также рассмотрим что такое pipes и как это работает. stdin, stdout, и stderr Shell (а также почти все команды Linux) принимает ввод команд из стандартного потока ввода stdin (поток 0) и отправляет вывод на стандартный поток вывода stdout (поток 1). Если команды завершаются с ошибками, то сообщения об ошибках отправляются в стандартный поток ошибок stderr (поток 2). Например, вы вводите команду echo Hello в консоли и нажимаете Enter (поток stdin), далее, вы видите на экране результат ее работы — Hello (поток stdout). Если возникла ошибка, то на экран выводится какое-то сообщение (поток stderr). В нашем примере мы работали со стандартным вводом, выводом и потоком ошибок, то есть набирали команду на клавиатуре, результаты видели на экране, ошибки также выводились на экран. В Unix есть возможность перенаправлять эти потоки. Например, вам нужно, чтобы результат работы команды отправлялся не на экран а в файл или чтобы ошибки отправлялись на e-mail и т. д. Такие ситуации в администрировании возникают постоянно. Это и есть перенаправление команд. Перенаправление стандартного вывода Рассмотрим перенаправление более подробно. В следующем примере stdout перенаправляется с помощью знака больше >: $ echo Hello world! Hello world! $ echo Hello world! > hello.txt $ cat hello.txt Hello world! В этом примере мы перенаправляем stdout в файл. При этом создается новый файл, если его не было или полностью перезаписывается, если он уже был создан. Обратите внимание, что запись > на самом деле является аббревиатурой от 1> (stdout называется поток 1). Даже если команда закончится с ошибкой файл все равно будет перезаписан! Будте внимательны при перенаправлении stdin в файл! $ cat hello.txt Hello world! $ zcho Hello world! > hello.txt -bash: zcho: command not found $ cat hello.txt $ Можно предотвратить перезапись файла при использовании 1> с помощью опции noclobber: $ cat hello.txt Hello world! $ set -o noclobber $ echo Hello world! > hello.txt -bash: hello.txt: cannot overwrite existing file $ set +o noclobber $ В тоже время опцию noclobber можно «обойти», используя >| вместо >: 1
  • 2. $ set -o noclobber $ echo Hello world! > hello.txt -bash: hello.txt: cannot overwrite existing file $ echo Hello world! >| hello.txt $ cat hello.txt Hello world! $ Если вам нужно добавить stdout в файл и при этом не перезаписать его, то используйте >>: $ echo Hello world! > hello.txt $ cat hello.txt Hello world! $ echo Hello Linux! >> hello.txt $ cat hello.txt Hello world! Hello Linux! $ Перенаправление ошибок Перенаправление потока ошибок выполняется с помощью 2>. Это делается достаточно часто, например, чтобы не «засорять» экран сообщениями об ошибках. В следующем примере перенаправляется stdout в файл и stderr на устройство /dev/null (вспомним, что /dev/null — это «черная дыра», а также, что 1> и > выполняют одно и тоже): $ find / > allfiles.txt 2> /dev/null $ Чтобы перенаправить в один файл и stdout и stderr можно использовать 2>&1: $ find / > allfiles_and_errors.txt 2>&1 $ Обратите внимание, важно в каком порядке выполняется перенаправление! Так, в следующем примере: ls > file.txt 2>&1 направляет и stdout (1) и stderr (2) в файл file.txt, а команда: ls 2>&1 > file.txt направляет только stdout в файл file.txt, а stderr просто копируется на stdout до того, как stdout был перенаправлен в файл. Пока это может показаться сложным, но, используя перенаправление на практике вы поймете этот механизм лучше. Перенаправление стандартного ввода Перенаправление stdin выполняется с помощью < (полная запись 0<): $ cat < text.txt one two $ tr 'onetw' 'ONEZZ' < text.txt ONE ZZO $ Существует способ (называется here document или here-is-document), чтобы выполнять перенаправление stdin до определенной последовательности символов (обычно это маркер EOF). Маркер EOF можно ввести прямо с клавиатуры или вставить комбинацией Ctrl-D: 2
  • 3. $ cat <<EOF > text.txt > one > two > EOF $ cat text.txt one two $ cat <<brol > text.txt > brel > brol $ cat text.txt brel $ Запутанное перенаправление Перед перенаправлением shell сканирует командную строкудо конца. Следующая команда легко читаема и абсолютно корректна: cat one.txt > two.txt 2> errors.txt В следующем примере команда также абсолютно корректна, но уже менее читабельна: 2> errors.txt cat one.txt > two.txt И даже эта команда будет корректна: < one.txt > two.txt 2> errors.txt cat Как быстро очистить файл Как удалить всю информацию из файла самым быстрым способом? > file.txt А если нужно очистить файл при включенной опции noclobber: >| file.txt Перенаправление stdout на stderr При фильтрации выходного потока, например, через обычный pipe (|) можно только фильтровать stdouot. Допустим, вы хотите отфильтровать некоторые малозначительные ошибки, из потока stderr. Этого нельзя сделать напрямую, поэтому вам нужно организовать обмен ("swap") между stdout и stderr: 3>&1 1>&2 2>&3 В этой конструкции мы используем временный поток 3, чтобы организовать обмен между stdout (1) и stderr (2). В следующем примере показано как отфильтровать из потока ошибок stderr все, что совпадает со значением переменной $error: $command 3>&1 1>&2 2>&3 | grep -v $error 3>&1 1>&2 2>&3 Но, этот способ не самый лучший. В следующем примере мы делаем то же самое используя pipe: /usr/bin/$command | & grep -v $error Pipes. Использование | Одно из самых мощных преимуществ Linux является использование pipes — именованных каналов. Pipes мспользуется для обмена данными между приложениями (от ангийского pipe – труба). Pipe берет стандартный вывод stdout предыдущей команды и перенаправляет его на стандартный ввод stdin следующей 3
  • 4. команды. Все команды в pipe выполняться одновременно. Рассмотрим следующий пример: $ ls /etc > etcfiles.txt $ tail -4 etcfiles.txt X11 xdg xml xpdf Здесь мы перенаправляем вывод команды ls (содержимое каталога /etc) в файл etcfiles.txt и выводим на экран последние 4 строки этого файла. Для выполнения задачи нам потребовалось ввести 2 команды. То же самое можно выполнить одной командой, используя pipe: $ ls /etc | tail -4 X11 xdg xml xpdf Чтобы создать pipe нужно между командами вставить |. Как видите, все достаточно просто. В одной командной строке можно использовать несколько pipes. В этом случае все команды также будут выполнены одновременно: $ ls /etc | tail -4 | tac xpdf xml xdg X11 4
  • 5. Практика: Перенаправление команд и pipes Задания: 1. Используя ls вывестиь содержимое каталога /etc в файл etc.txt. 2. Включить опцию noclobber. 3. Убедитесь, что опция nocclobber включена, для этого попробуйте повторить задание 1. 4. Если вывести все опции shell, каким образом будет отображаться опция noclobber? 5. Отключите опцию noclobber. 6. Откройте второй shell. В первом shell создайте пустой файл tailing.txt. Затем выполните команду tail -f tailing.txt. Перейдите во второй shell и добавьте произвольную строку текста в этот файл. Вернитесь в первый shell и убедитесь, что в нем эта строка также отображается. 7. Создайте файл, содержащий имена и фамилии пяти человек. Для этого используйте команду cat и перенаправление стандартного вывода, чтобы создать пустой файл, а также here document (EOF) чтобы закончить ввод имен. Ответы: 1. ls /etc > etc.txt 2. set -o noclobber 3. ls /etc > etc.txt (должно быть сообщение об ошибке) 4. echo $- (опция noclobber выводится как C) 5. set +o noclobber 6. В первом shell: $ > tailing.txt $ tail -f tailing.txt hello world Во втором shell: $ echo hello >> tailing.txt $ echo world >> tailing.txt 7. $ cat > names.txt << EOF > Igor Petrov > Andrey Ivanov > Elena Andreeva > Olga Stepanova > Ilya Nikitin > EOF $ cat names.txt Igor Petrov Andrey Ivanov Elena Andreeva Olga Stepanova Ilya Nikitin 5