- Bash pipe tutorial
- What are pipes?
- Pipelines
- Facts about pipes
- How to use pipes by example
- Using | pipes
- Linux Bash Pipe Command Usage with Examples For Redirection
- Bash Pipe Concept
- Bash Pipe Usage
- Pipe Multiple Commands
- Pipe To Grep Command
- Pipe To Less Command
- Linux pipes tips & tricks
- Pipe — что это?
- Логика
- Простой дебаг
- Исходный код, уровень 1, shell
- Исходный код, уровень 2, ядро
- Tips & trics
- 6 операторов для цепочек командной строки оболочки Bash
- Вступление
- 1. && Оператор (AND оператор)
- 2. OR Оператор (||)
- 3. Оператор AND & OR (&& и ||)
- 4. Оператор PIPE (|)
- 5. Оператор точка с запятой (;)
- 6. Амперсанд Оператор (&)
- Оболочка Bash — шпаргалка для начинающих
- Оболочка Bash: введение
- Навигация
- mkdir
- Основные команды
- false
- history
- export
- Переменные окружения
- Коннекторы
- Конвейеры
- Перенаправление ввода/вывода
- Перенаправление вывода
- Перенаправление ввода
- Продвинутое перенаправление
- Права доступа
- chmod
- Сочетания клавиш
Bash pipe tutorial
There is always time for pipes. The white rabbit can wait.
Pipes (or pipelines) are one of those things that you learn to use intuitively through the idiomatic use cases that we know and love but never come around to fully understand. Lucky enough, today is a good day to dive into the depth of pipes, don’t you think?
Heads up, in writing this article, I got better at pipes. Hopefully, you do too.
What are pipes?
A pipe is an enclosed medium that allows flow from one end to another. In the real-world pipes are used to convey matter, mostly liquid such as water or gas such as smoke but sometimes convey a mixture of liquid and solids. In a Linux environment, a pipe is a special file that connects the output of one process to the input of another process. In bash, a pipe is the | character with or without the & character. With the power of both characters combined we have the control operators for pipelines, | and |& .
As you could imagine, stringing commands together in bash using file I/O is no pipe dream. It is quite easy if you know your pipes.
So, before you start killing it with pipes in bash, see how pipelines can help you get more done shell script with less code. Read on.
Pipelines
According to the bash manual section on pipelines (3.2.2 Pipelines), A pipeline is a sequence of one or more commands separated by one of the control operators ‘|’ or ‘|&’. That means every command is a pipeline whether or not you use its pipeline control operators.
When we strip away all of the options in the format for a pipeline:
What do you know? We’ve been using pipelines in bash all this time without knowing. Well, now you know. Anyways, let’s see how we can start to use pipelines for real with time –p ! and | or &|.
Facts about pipes
- Pipeline time
A pipeline may begin with time, which reports runtime statistics after completion of the pipeline - Pipeline portable time
time accepts the option -p for improved portability of runtime statistics, replacing tab with single space and converting time to seconds with no unit, the output format specified by POSIX - Pipeline operators and implicit redirection
By default, only standard output of commands on the left-hand side of the operator | is connect to commands on the other side. To have standard error connected as well the &| operator may be used. However, it is simply shorthand for 2>&1| , which redirects standard error to standard error before the pipeline operator. - List precedence in pipelines
If the command on the left-hand side of the pipeline operator is a list ( < command1; command2; …>or (command1;command2;…)) , the pipeline waits for the list to complete - Pipeline behavior under lastpipe
Commands in a pipeline are executed in subshells unless the lastpipe shopt is enabled. If lastpipe is enabled, the command on the far-right side is executed as a command belonging to the current shell. See Test lastpipe in Tests. - Custom time format
time output may be customized using the bash variable TIMEFORMAT . See Test time format in Tests. - Pipeline behavior under pipefail
By default, all commands in the pipeline are executed without regard of the exit status of commands on to the left and the exit status of the right-most command is return. However, if pipefail is enabled, the pipeline will terminate abruptly if any of its commands returns a non-zero exit status. Also, the pipeline exit status will be that of the last command exited with a non-zero exit status.
How to use pipes by example
As mentioned in What are pipes, bash has two control operators for pipelines, namely | and |& . That is the groundwork. Let’ go into how to use pipes.
Using | pipes
This is the standard pipeline that most bash programmers have touched sometime or another. It only passes standard output right, down the pipeline.
Источник
Linux Bash Pipe Command Usage with Examples For Redirection
Linux Bash provides a lot of useful features and commands. Pipe or | is one of them. Bash provides a command-line interface facility which mainly used to concatenate command output to another command.
Bash Pipe Concept
In Linux everything is file. This may seem odd but it is. Every command executed will have three type of streams which can be used to provide or output data into and from a command.
- STDIN (0) Standard input where command reads from. In bash default is bash shell
- STDOUT (1) Standard output where command output written. In bash default output is bash shell generally.
- STDERR (2) Standard error where command errors are written.
Bash Pipe Usage
The pipe will redirect the command STDOUT or standard output into the given next command STDIN or standard input. The syntax is like below. In this example, COMMAND1 output will be feed into COMMAND2 as input.
Now let’s make a simple example. We will use cat command to print file named names.txt into command sort as input.
Pipe Multiple Commands
In the previous example, we have used only one pipe but we can use multiple pipes without a problem to make things better. We just put them in a string like below. In this example, we will pipe commands cat , sort and grep
Pipe To Grep Command
One of the most popular usages of the pipe is with grep command. We will use multiple grep commands in this example where we will filter line those contains a and i letters.
Pipe To Less Command
less command is another use case for the bash pipe. We generally use cat command to print a file context into less command. In this example, we want to look into the log file of firewalld .
Источник
Linux pipes tips & tricks
Pipe — что это?
Pipe (конвеер) – это однонаправленный канал межпроцессного взаимодействия. Термин был придуман Дугласом Макилроем для командной оболочки Unix и назван по аналогии с трубопроводом. Конвейеры чаще всего используются в shell-скриптах для связи нескольких команд путем перенаправления вывода одной команды (stdout) на вход (stdin) последующей, используя символ конвеера ‘|’:
grep выполняет регистронезависимый поиск строки “error” в файле log, но результат поиска не выводится на экран, а перенаправляется на вход (stdin) команды wc, которая в свою очередь выполняет подсчет количества строк.
Логика
Конвеер обеспечивает асинхронное выполнение команд с использованием буферизации ввода/вывода. Таким образом все команды в конвейере работают параллельно, каждая в своем процессе.
Размер буфера начиная с ядра версии 2.6.11 составляет 65536 байт (64Кб) и равен странице памяти в более старых ядрах. При попытке чтения из пустого буфера процесс чтения блокируется до появления данных. Аналогично при попытке записи в заполненный буфер процесс записи будет заблокирован до освобождения необходимого места.
Важно, что несмотря на то, что конвейер оперирует файловыми дескрипторами потоков ввода/вывода, все операции выполняются в памяти, без нагрузки на диск.
Вся информация, приведенная ниже, касается оболочки bash-4.2 и ядра 3.10.10.
Простой дебаг
Исходный код, уровень 1, shell
Т. к. лучшая документация — исходный код, обратимся к нему. Bash использует Yacc для парсинга входных команд и возвращает ‘command_connect()’, когда встречает символ ‘|’.
parse.y:
Также здесь мы видим обработку пары символов ‘|&’, что эквивалентно перенаправлению как stdout, так и stderr в конвеер. Далее обратимся к command_connect():make_cmd.c:
где connector это символ ‘|’ как int. При выполнении последовательности команд (связанных через ‘&’, ‘|’, ‘;’, и т. д.) вызывается execute_connection():execute_cmd.c:
PIPE_IN и PIPE_OUT — файловые дескрипторы, содержащие информацию о входном и выходном потоках. Они могут принимать значение NO_PIPE, которое означает, что I/O является stdin/stdout.
execute_pipeline() довольно объемная функция, имплементация которой содержится в execute_cmd.c. Мы рассмотрим наиболее интересные для нас части.
execute_cmd.c:
Таким образом, bash обрабатывает символ конвейера путем системного вызова pipe() для каждого встретившегося символа ‘|’ и выполняет каждую команду в отдельном процессе с использованием соответствующих файловых дескрипторов в качестве входного и выходного потоков.
Исходный код, уровень 2, ядро
Обратимся к коду ядра и посмотрим на имплементацию функции pipe(). В статье рассматривается ядро версии 3.10.10 stable.
fs/pipe.c (пропущены незначительные для данной статьи участки кода):
Если вы обратили внимание, в коде идет проверка на флаг O_NONBLOCK. Его можно выставить используя операцию F_SETFL в fcntl. Он отвечает за переход в режим без блокировки I/O потоков в конвеере. В этом режиме вместо блокировки процесс чтения/записи в поток будет завершаться с errno кодом EAGAIN.
Максимальный размер блока данных, который будет записан в конвейер, равен одной странице памяти (4Кб) для архитектуры arm:
arch/arm/include/asm/limits.h:
Для ядер >= 2.6.35 можно изменить размер буфера конвейера:
Максимально допустимый размер буфера, как мы видели выше, указан в файле /proc/sys/fs/pipe-max-size.
Tips & trics
В примерах ниже будем выполнять ls на существующую директорию Documents и два несуществующих файла: ./non-existent_file и. /other_non-existent_file.
Перенаправление и stdout, и stderr в pipe
или же можно использовать комбинацию символов ‘|&’ (о ней можно узнать как из документации к оболочке (man bash), так и из исходников выше, где мы разбирали Yacc парсер bash):
Перенаправление _только_ stderr в pipe
Shoot yourself in the foot
Важно соблюдать порядок перенаправления stdout и stderr. Например, комбинация ‘>/dev/null 2>&1′ перенаправит и stdout, и stderr в /dev/null.
Получение корректного кода завершения конвейра
По умолчанию, код завершения конвейера — код завершения последней команды в конвеере. Например, возьмем исходную команду, которая завершается с ненулевым кодом:
И поместим ее в pipe:
Теперь код завершения конвейера — это код завершения команды wc, т.е. 0.
Обычно же нам нужно знать, если в процессе выполнения конвейера произошла ошибка. Для этого следует выставить опцию pipefail, которая указывает оболочке, что код завершения конвейера будет совпадать с первым ненулевым кодом завершения одной из команд конвейера или же нулю в случае, если все команды завершились корректно:
Shoot yourself in the foot
Следует иметь в виду “безобидные” команды, которые могут вернуть не ноль. Это касается не только работы с конвейерами. Например, рассмотрим пример с grep:
Здесь мы печатаем все найденные строки, приписав ‘new_’ в начале каждой строки, либо не печатаем ничего, если ни одной строки нужного формата не нашлось. Проблема в том, что grep завершается с кодом 1, если не было найдено ни одного совпадения, поэтому если в нашем скрипте выставлена опция pipefail, этот пример завершится с кодом 1:
В больших скриптах со сложными конструкциями и длинными конвеерами можно упустить этот момент из виду, что может привести к некорректным результатам.
Источник
6 операторов для цепочек командной строки оболочки Bash
Вступление
Теперь давайте обсудим каждый Оператор один за другим.
1. && Оператор (AND оператор)
Синтаксис использования оператора AND:
Оператор выполнит вторую команду только в том случае, если команда 1 успешно выполнена.
Теперь рассмотрим синтаксис выше.
Здесь команда 2 будет выполняться только в том случае, если команда 1 выполнена успешно. Например :
Здесь, как вы можете видеть ниже, первая команда успешно завершена, тогда выполняется вторая команда df -h.
Теперь давайте проверим оператор AND по-другому.
Здесь я не буду выполнять первую команду и посмотрю, выполняется ли вторая команда или нет.
Как вы можете видеть выше, первая команда не работает, поэтому вторая команда не выполняется.
2. OR Оператор (||)
Синтаксис использования оператора OR:
OR полностью противоположна оператору &&.
OR выполнит вторую команду только в том случае, если первая команда провалится.
Теперь давайте приведем пример:
Как вы можете видеть выше, вторая команда выполнена, то есть «df -h», когда первая команда не удалась.
3. Оператор AND & OR (&& и ||)
Комбинация оператора && и OR (||) довольно интересна и даст вам хороший результат, если вы используете его правильно.
Комбинация этих двух операторов, как например, if … else в программировании.
Давайте приведем пример, чтобы вы получили больше представлений по этому поводу:
Как вы можете видеть выше, наша первая команда успешно выполнена, поэтому мы можем получить требуемое сообщение.
4. Оператор PIPE (|)
PIPE – это своего рода оператор, который может использоваться для отображения вывода первой команды, принимая ввод второй команды.
Например, вы хотите проверить все текущие системные процессы, используя команду ps -ef. но поскольку список процессов настолько длинный, что его нельзя охватить на одном экране.
В этом случае вы можете использовать фильтр с командой more.
5. Оператор точка с запятой (;)
Оператор точка с запятой выполняет несколько команд одновременно последовательно, как упоминалось, и обеспечивает вывод без зависимости от успеха и отказа других команд, таких как && и OR (||).
Посмотрите пример ниже:
6. Амперсанд Оператор (&)
Оператор Амперсанда – это своего рода оператор, который выполняет заданные команды в фоновом режиме.
Вы можете использовать этот оператор для одновременного выполнения нескольких команд.
Вы также можете выполнять несколько команд с помощью оператора Ampersand. См. Команду ниже.
Источник
Оболочка Bash — шпаргалка для начинающих
В данной шпаргалке затрагиваются следующие темы: введение в оболочку, навигация, основные команды, переменные окружения, коннекторы, конвейеры, перенаправление ввода/вывода, права доступа и комбинации клавиш.
Оболочка Bash: введение
Оболочка, или шелл (shell) — это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как gnome-terminal, eterm, nxterm и т. п.
Навигация
В Linux файлы и каталоги имеют иерархическую организацию, то есть существует некий начальный каталог, называемый корневым. В нём содержатся файлы и подкаталоги, которые в свою очереди содержат файлы и свои подкаталоги.
Команда pwd , сокращение от print working directory, отображает текущее местоположение в структуре каталогов.
Команда cd позволяет перейти в новый каталог.
Синтаксис | Объяснение |
---|---|
cd | Перемещение в домашний каталог |
cd | Перемещение в домашний каталог |
cd .. | Перемещение на один уровень выше |
cd — | Перемещение в предыдущий каталог |
cd Directory1 | Перемещение в каталог Directory1 |
cd Directory1/Directory2 | Перемещение в каталог Directory2 по указанному пути |
mkdir
Команда mkdir создаёт новый каталог в текущем каталоге.
Основные команды
Команда man отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat :
Команда cat считывает файл, переданный как аргумент, и выводит его содержимое по стандартному каналу вывода. Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.
Команда echo выводит свои аргументы по стандартному каналу вывода.
Если вызвать echo без аргументов, будет выведена пустая строка.
Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:
Команда tail работает аналогично команде head , но читает строки с конца:
Также можно просматривать добавляемые к файлу строки в режиме реального времени при помощи флага -f :
Команда less позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.
Подробнее о назначении символа | будет рассказано ниже в разделе команды history .
Обычные сочетания клавиш | Описание |
---|---|
G | Перемещает в конец файла |
g | Перемещает в начало файла |
:50 | Перемещает на 50 строку файла |
q | Выход из less |
/searchterm | Поиск строки, совпадающей с ‘searchterm’, ниже текущей строки |
/ | Перемещает на следующий подходящий результат поиска |
?searchterm | Поиск строки, совпадающей с ‘searchterm’, выше текущей строки |
? | Перемещает на следующий подходящий результат поиска |
up | Перемещает на одну строку выше |
down | Перемещает на одну строку ниже |
pageup | Перемещает на одну страницу выше |
pagedown | Перемещает на одну страницу ниже |
Команда true всегда возвращает ноль в качестве выходного статуса для индикации успеха.
false
Команда false всегда возвращает не-ноль в качестве выходного статуса для индикации неудачи.
$? — это переменная, которая содержит выходной статус последней запущенной команды. Под статусом обычно понимается код возврата программы. 0 означает успешное выполнение программы, любое значение большее 0 отражает тот факт, что в процессе выполнения возникли некоторые ошибки. Кстати, именно поэтому в bash истинной (true) считается 0, а все, что не 0 — ложью (false):
Команда grep занимается поиском переданной строки в указанном файле:
grep также может принимать несколько файлов и регулярных выражений для уточнения формата текста.
Обычные флаги | Описание |
---|---|
-i | Отключение чувствительности к регистру |
-r | Рекурсивный поиск по директориям |
-w | Поиск только целых слов |
-c | Вывод количества найденных элементов |
-n | Вывод всей строки, содержащей запрос |
-v | Вывод инвертированного совпадения |
Также можно ознакомиться с руководством по regex. У нас на сайте тоже есть руководство по «регуляркам» в Python для новичков.
Команда sed — это потоковый редактор, преобразующий входные текстовые данные. Обычно её используют для замены выражений так: s/regexp/replacement/g . Например, следующий код заменит все слова «Hello» на «Hi»:
Также вы можете ознакомиться с руководством по sed.
history
Команда history выводит историю командной строки. Обычно её используют вместе с командой grep для поиска конкретной команды. Например, следующий код найдёт все команды, содержащие строку g++ :
Здесь также используется символ | — это так называемый конвейер (pipe). Благодаря ему можно перенаправлять вывод одной команды на вход другой — таким образом в примере выше вся история, которая в обычном режиме выводится командой history прямо в вывод терминала, будет перенаправлена в grep в качестве входных данных. Мы не увидим вывода команды history , но увидим вывод команды grep .
Это может быть довольно сложно для понимания без практики, поэтому поэкспериментируйте самостоятельно, например с командами ls , history , ps (описана ниже), перенаправляя их вывод в grep , sed или less , например.
export
Команда export устанавливает переменные окружения для передачи дочерним процессам. Например, так можно передать переменную name со значением student :
Команда ps выводит информацию о запущенных процессах.
Выводится четыре элемента:
- ID процесса (PID),
- тип терминала (TTY),
- время работы процесса (TIME),
- имя команды, запустившей процесс (CMD).
Команда awk находит и заменяет текст в файлах по заданному шаблону: awk ‘pattern
Команда wget скачивает файлы из Сети и помещает их в текущий каталог.
Команда nc — это утилита для отладки сети. Также можно ознакомиться с руководством по nc.
Команда ping тестирует сетевое подключение.
Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.
Git — это популярная система контроля версий. Также можно ознакомиться с руководством по git и нашими материалами.
Переменные окружения
Переменные окружения — это именованные переменные, содержащие значения, используемые одним или несколькими приложениями.
Переменная PATH содержит список каталогов, в которых система ищет исполняемые файлы.
11–13 октября, Онлайн, Беcплатно
Переменная HOME содержит путь к домашнему каталогу текущего пользователя.
Коннекторы
Коннекторы позволяют запускать несколько команд одновременно.
Коннектор | Описание |
---|---|
&& | Первая команда исполняется всегда, вторая — только в случае успешного завершения первой |
|| | Первая команда исполняется всегда, вторая — только в случае неудачного завершения первой |
; | Команды исполняются всегда |
Конвейеры
Конвейеры, или пайпы, позволяют соединять входные и выходные каналы различных команд. В следующем примере вывод команды ls будет передан в head , и в результате будет напечатано лишь 10 первых элементов.
Перенаправление ввода/вывода
Перенаправление вывода
Для стандартного перенаправления вывода используются символы > и >> .
Например, этот код передаст вывод ls в файл, а не на экран:
Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду >> — она дописывает данные в конец файла.
Перенаправление ввода
Для стандартного перенаправления вывода используется символ . В следующем примере sort берет входные данные из файла, а не с клавиатуры:
Команда sort выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:
Продвинутое перенаправление
Добавление & к > приводит к перенаправлению как стандартного потока выхода, так и потока ошибок. Например, файл test.cpp выведет строку stdout в cout и строку stderr в cerr .
Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к > .
Имя | Дескриптор | Описание |
---|---|---|
stdin | 0 | Стандартный поток ввода |
stdout | 1 | Стандартный поток вывода |
stderr | 2 | Стандартный поток вывода ошибок |
Например, для перенаправления stderr в test.txt нужно сделать следующее:
Права доступа
Команда ls -l выводит много информации о правах доступа к каждому файлу:
Вывод в примере | Описание / возможные выводы |
---|---|
— | Тип файла: — файл d каталог |
rw- | Права доступа владельца файла |
rw- | Права доступа членов группы-владельца файла |
r– | Права доступа прочих пользователей |
user | Имя владельца файла |
group | Имя группы-владельца файла |
chmod
Команда chmod изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:
Буква | Пользователь |
---|---|
u | Владелец |
g | Член группы |
o | Прочие пользователи |
a | Все пользователи |
Вы можете вызвать chmod с описанием действий над конкретным файлом. Символ — обозначает удаление прав, символ + — добавление. Следующий пример сделает файл доступным для чтения и записи владельцу и группе:
Кроме того, chmod можно использовать с восьмеричными числами, где 1 — это наличие прав, а 0 — отсутствие:
Следующая команда сработает так же, как и предыдущая:
Сочетания клавиш
Сочетание | Описание |
---|---|
CTRL-A | Перемещение курсора в начало строки |
CTRL-E | Перемещение курсора в конец строки |
CTRL-R | Поиск по истории |
CTRL-W | Вырезать последнее слово |
CTRL-U | Вырезать всё до курсора |
CTRL-K | Вырезать всё после курсора |
CTRL-Y | Вернуть последнюю вырезанную строку |
CTRL-_ | Отмена |
CTRL-L | Очистка экрана терминала |
Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.
Перейти к регистрации
Источник