- Фундаментальные основы Linux. Часть IV. Программные каналы и команды
- Глава 16. Перенаправление потоков ввода/вывода
- Потоки данных stdin, stdout и stderr
- Перенаправление стандартного потока вывода
- Перенаправление стандартного потока ошибок
- Перенаправление стандартного потока вывода и программные каналы
- Объединение стандартных потоков вывода stdout и ошибок stderr
- Перенаправление стандартного потока ввода
- Неоднозначное перенаправление потоков ввода/вывода
- Быстрая очистка содержимого файла
- Практическое задание: перенаправление потоков ввода/вывода
- Корректная процедура выполнения практического задания: перенаправление потоков ввода/вывода
- Работа с потоками STDIN, STDOUT, STDERR
- Виды потоков
- Управление потоками
- Заключение
- Потоки данных
- stdout
- stderr
- stdin
- Перенаправление потоков
- Explained: Input, Output and Error Redirection in Linux
- Stdin, stdout and stderr
- The output redirection
- The output file is created beforehand
- Append instead of clobber
- Pipe redirection
- Remember the stdout/stdin is a chunk of data, not filenames
- The input redirection
- Stderr redirection examples
- Summary
Фундаментальные основы Linux. Часть IV. Программные каналы и команды
Оригинал: Linux Fundamentals
Автор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 15 декабря 2014 г.
Глава 16. Перенаправление потоков ввода/вывода
Одной из мощных возможностей командной оболочки системы Unix является механизм перенаправления потоков ввода/вывода с возможностью задействования программных каналов .
В данной главе даются пояснения относительно перенаправления стандартных потоков ввода, вывода и ошибок.
Потоки данных stdin, stdout и stderr
Командная оболочка bash поддерживает три типа базовых потоков данных; она принимает данные из стандартного потока ввода stdin (поток 0 ), отправляет данные в стандартный поток вывода stdout (поток 1 ), а также отправляет сообщения об ошибках в стандартный поток ошибок stderr (поток 2 ).
Приведенная ниже иллюстрация является графической интерпретацией этих трех потоков данных.
Клавиатура обычно служит источником данных для стандартного потока ввода stdin , в то время, как стандартные потоки вывода stdout и ошибок stderr используются для вывода данных. Новых пользователей Linux может смущать подобное разделение, так как не существует очевидного способа дифференцирования стандартных потоков вывода stdout и ошибок stderr . Опытные же пользователи знают о том, что разделение стандартных потоков вывода и ошибок может оказаться весьма полезным.
В следующем разделе будет рассказано о том, как осуществляется перенаправление упомянутых потоков данных.
Перенаправление стандартного потока вывода
Операция перенаправления потока данных stdout (>)
Перенаправление стандартного потока вывода stdout может быть осуществлено с помощью символа знака «больше» . В том случае, если при разборе строки команды командная оболочка обнаруживает символ знака >, она удаляет данные из файла и перенаправлет данные из стандартного потока вывода в него.
командная оболочка будет рассматривать только два аргумента (echo = аргумент 0, привет = аргумент 1). Описание операции перенаправления потока данных удаляется перед началом подсчета количества аргументов.
Содержимое выходного файла удаляется
Параметр командной оболочки noclobber
Нейтрализация влияния параметра командной оболочки noclobber
Перенаправление стандартного потока ошибок
Операция перенаправления потока данных stderr (2>)
Перенаправление стандартного потока ошибок осуществляется с помощью оператора 2> . Такое перенаправление может оказаться очень полезным для предотвращения заполнения вашего экрана сообщениями об ошибках.
Операция перенаправления нескольких потоков данных 2>&1
позволяет перенаправить только данные из стандартного потока вывода в файл dirlist, так как с помощью данной команды осуществляется копирование дескриптора стандартного потока вывода в дескриптор стандартного потока ошибок перед тем, как стандартный поток вывода перенаправляется в файл dirlist.
Перенаправление стандартного потока вывода и программные каналы
Объединение стандартных потоков вывода stdout и ошибок stderr
Перенаправление стандартного потока ввода
Операция перенаправления потока данных stdin ( стандартного потока ввода stdin осуществляется с помощью оператора here document (иногда называемая структурой here-is-document) является механизмом для ввода данных до момента обнаружения определенной последовательности символов (обычно EOF). Маркер EOF может быть либо введен вручную, либо вставлен автоматически при нажатии комбинации клавиш Ctrl-D.
Структура here string может использоваться для непосредственной передачи строк команде. При использовании данной структуры достигается такой же эффект, как и при использовании команды echo строка | команда (но вы сможете избежать создания одного дополнительного процесса).
Для получения дополнительной информации об алгоритме base64 следует обратиться к стандарту rfc 3548.
Неоднозначное перенаправление потоков ввода/вывода
Быстрая очистка содержимого файла
Практическое задание: перенаправление потоков ввода/вывода
1. Активируйте параметр командной оболочки noclobber .
2. Проверьте, активирован ли параметр noclobber , повторив вызов команды вывода содержимого директории ls для директории /etc с перенаправлением данных из стандартного потока вывода в файл.
3. Какой из символов представляет параметр noclobber в списке всех параметров командной оболочки.
4. Деактивируйте параметр noclobber .
5. Убедитесь в том, что вы имеете доступ к двум командным оболочкам, открытым на одном компьютере. Создайте пустой файл tailing.txt . После этого выполните команду tail -f tailing.txt . Используйте вторую командную оболочку для добавления строки текста в этот файл. Убедитесь в том, что эта строка была выведена в первой командной оболочке.
6. Создайте файл, содержащий имена пяти людей. Используйте команду cat и механизм перенаправления потоков ввода/вывода для создания файла, а также структуру here document для завершения ввода.
Корректная процедура выполнения практического задания: перенаправление потоков ввода/вывода
1. Активируйте параметр командной оболочки noclobber .
2. Проверьте, активирован ли параметр noclobber , повторив вызов команды вывода содержимого директории ls для директории /etc с перенаправлением данных из стандартного потока вывода в файл.
3. Какой из символов представляет параметр noclobber в списке всех параметров командной оболочки.
4. Деактивируйте параметр noclobber .
5. Убедитесь в том, что вы имеете доступ к двум командным оболочкам, открытым на одном компьютере. Создайте пустой файл tailing.txt . После этого выполните команду tail -f tailing.txt . Используйте вторую командную оболочку для добавления строки текста в этот файл. Убедитесь в том, что эта строка была выведена в первой командной оболочке.
6. Создайте файл, содержащий имена пяти людей. Используйте команду cat и механизм перенаправления потоков ввода/вывода для создания файла, а также структуру here document для завершения ввода.
Источник
Работа с потоками STDIN, STDOUT, STDERR
Виды потоков
В системах Linux и Unix существуют стандартные входной (STDIN) и выходные (STDOUT, STDERR) потоки (каналы). Далее рассмотрим подробнее каждый из них.
- STDIN (Номер файлового дескриптора — 0)
Стандартный входной поток. Канал принимающий данные для обработки и последующей передачи на канал STDOUT и/или STDERR. - STDOUT (Номер файлового дескриптора — 1)
Стандартный выходной поток. Представляет собой канал записи результатов выполнения каких-либо процессов. - STDERR (Номер файлового дескриптора — 2)
Стандартный выходной поток ошибок. В данный канал попадают сообщения об ошибках.
В рамках терминала канал STDIN считывает входные данные, а каналы STDOUT и STDERR выводят выходные данные на экран.
Управление потоками
Для перенаправления каналов в терминале, применяют определенные символы. Рассмотрим каждый из них на примере команды поиска системных файлов, которые содержат слово — core. Все найденные файлы будут формироваться в поток STDOUT. Те найденные файлы, к которым у обычного пользователя нет доступа будут попадать в STDERR.
find / -name core > /tmp/testfile
В файл /tmp/testfile попадет список путей ко всем найденным файлам, а список ошибок отобразится в терминале.
Запись STDOUT в файл
Символ > — затирает все его содержимое и вставляет значение из потока, поэтому будьте осторожны при правке системных файлов используя данный символ. Если Вам нужно добавить данные в конец файла — используйте два последовательных символа — >> .
- >> — вывод STDOUT в конец файла.
find / -name core >> /tmp/testfile
В конец файла /tmp/testfile попадет список путей ко всем найденным файлам, а список ошибок отобразится в терминале.
Запись STDOUT в конец файла
- >& — вывод STDOUT и STDERR в файл
find / -name core >& /tmp/testfile
С помощью составного символа — >& мы объединяем стандартный выходной поток с выходным потоком ошибок. В файл /tmp/testfile попадет список путей ко всем найденным файлам и список ошибок.
Объединение выходных потоков
- 2> — вывод STDERR в файл
find / -name core 2> /tmp/testfile
В файл /tmp/testfile попадет список ошибок, а список найденных файлов, будет выведен в терминале.
Вывод STDERR
Вывод потоков можно комбинировать и распределять по разным местам. Например, выведем список найденных файлов в /tmp/testfile , а список ошибок отбросим, перенаправив их в /dev/null .
find / -name core > /tmp/testfile 2> /dev/null
Перенаправление потоков
Для того чтобы направить выходной поток одной команды на входной поток другой, применяют символ — | (pipe).
Для примера, выведем в консоли отдельные процессы системы с именем — chrome .
ps | grep chrome
Здесь результат выполнения команды ps передается в роли входных данных для команды grep , в которых она ищет совпадения с именем chrome .
Заключение
В этой небольшой статье мы рассмотрели все стандартные входные и выходные и потоки, которые, в свою очередь, очень часто применяются системными администраторами на практике.
Понравилась статья? Расскажите о ней друзьям!
Источник
Потоки данных
Статья посвящена работой с потоками данных в bash. Я постарался написать ее наиболее доступным и простым языком, чтобы было понятно даже новичкам в Linux.
В одной из моих статей мы рассматривали запись звука в файл с помощью команды:
Эта команда читает файл (устройство) /dev/audio с помощью команды cat и перенаправляет информацию из него в файл /tmp/my.sound (с помощью оператора >).
У каждой программы существует 3 системных потока: stdout, stderr, stdin.
stdout
Стандартный поток вывода данных для программ. Например, когда мы пишем команду ls, то список папок и файлов она выводит именно в этот поток, который отображается у нас в консоли:
stderr
Поток вывода ошибок. Если программа не смогла сделать все как надо — она пишет именно в этот поток. Например, когда rm пытается удалить несуществующий файл:
$ rm example.txt
rm: example.txt: No such file or directory
stdin
Поток ввода данных. А вот это довольно интересный и удобный поток. Например, его использует вэб-сервер, когда просит интерпретаторы выполнить скрипты через CGI. Мы тоже можем попробовать:
В этом примере мы встретили оператор перенаправления потока вывода. Мы остановимся на нем позже.
Перенаправление потоков
Для начала рассмотрим перенаправление потоков в файлы, устройства и другие потоки.
В этом примере мы направили stdout команды ls в файл 1.txt. Читаем его:
Да, все успешно записалось.
Теперь попробуем направить stderr команды rm:
Здесь мы использовали номер потока stderr (2). По умолчанию оператор > перенаправляет поток stdout, который имеет номер 1. Чтобы направить другой поток, надо перед оператором > поставить его номер.
Мы можем направлять одни потоки в направлении других:
В этом примере мы направили поток stdout в файл 1.txt, а затем направили stderr туда же, куда направлен stdout с помощью оператора & перед номером потока.
Теперь давайте поиграем с потоком stdin. Например, я хочу найти все папки «.svn» в некотором проекте и удалить:
Команда find с параметром. выводит в stdout все вложенные папки и файлы, которые находит в данной папке и во всех вложенных.
Теперь нам надо выбрать только папки с именем «.svn»:
Оператор | перенаправляет stdout одного приложения в stdin следующего. То есть все строки найденные с помощью find пошли в команду grep, которая выбирает строки по определенным условиям и выводит их. Здесь условие — это регулярное выражение, которое говорит о том, что строка должна заканчиваться на «/.svn».
Нужные папки мы выбрали, осталось их удалить.
И снова новый оператор: `. Он забирает stdout из команды, которую он окружает и вставляет в данное место как строку.
Получается, что мы запросили все файлы, выбрали из них папки с именем «.svn» и отдали результат как аргументы команде rm. В этом случае у нас будут проблемы если имена файлов и папок содержат пробелы. Исправляем ситуацию:
Теперь мы отдаем нужные файлы команде xargs, которая вызывает rm -Rf и в качестве параметров использует свой stdin построчно. Задача решена.
Источник
Explained: Input, Output and Error Redirection in Linux
If you are familiar with the basic Linux commands, you should also learn the concept of input output redirection.
You already know how a Linux command functions. It takes an input and gives you an output. There are a few players in the scene here. Let me tell you about them.
Stdin, stdout and stderr
When you run a Linux command, there are three data stream that play a part in it:
- Standard input (stdin) is the source of input data. By default, stdin is any text entered from the keyboard. It’s stream ID is 0.
- Standard output (stdout) is the outcome of command. By default, it is displayed on the screen. It’s stream ID is 1.
- Standard error (stderr) is the error message (if any) produced by the commands. By default, stderr is also displayed on the screen. It’s stream ID is 2.
These streams contain the data in plain text in what’s called buffer memory.
Think of it as water stream. You need a source for water, a tap for example. You connect a pipe to it and you can either store it in a bucket (file) or water the plants (print it). You can also connect it to another tap, if needed. Basically, you are redirecting the water.
Linux also has this concept of redirection, where you can redirect the stdin, stdout and stderr from its usual destination to another file or command (or even peripheral devices like printers).
Let me show how redirection works and how you can use it.
The output redirection
The first and simplest form of redirection is output redirection also called stdout redirection.
You already know that by default, the output of a command is displayed on the screen. For example, I use the ls command to list all the files and this is the output I get:
With output redirection, you can redirect the output to a file. If this output files doesn’t exist, the shell will create it.
For example, let me save the output of the ls command to a file named output.txt:
The output file is created beforehand
What do you think the content of this output file should be? Let me use the cat command to show you a surprise:
Did you notice that the inclusion of output.txt there? I deliberately chose this example to show you this.
The output file to which the stdout is redirected is created before the intended command is run. Why? Because it needs to have the output destination ready to which the output will be sent.
Append instead of clobber
One often ignored problem is that if you redirect to a file that already exists, the shell will erase (clobber) the file first. This means the existing content of the output file will be removed and replaced by the output of the command.
You can append, instead of overwriting it, using the >> redirection syntax.
Tip: You can forbid clobbering in current shell session using: set -C
Why would you redirect stdout? You can store the output for future reference and analyze it later. It is specially helpful when the command output is way too big and it takes up all of your screen. It’s like collecting logs.
Pipe redirection
Before you see the stdin redirection, you should learn about pipe redirection. This is more common and probably you’ll be using it a lot.
With pipe redirection, you send the standard output of a command to standard input of another command.
Let me show you a practical example. Say, you want to count the number of visible files in the current directory. You can use ls -1 (it’s numeral one, not letter L) to display the files in the current directory:
You probably already know that wc command is used for counting number of lines in a file. If you combine both of these commands with pipe, here’s what you get:
With pipe, both commands share the same memory buffer. The output of the first command is stored in the buffer and the same buffer is then used as input for the next command.
You’ll see the result of the last command in the pipeline. That’s obvious because the stdout of earlier command(s) is fed to the next command(s) instead of going to the screen.
Pipe redirection or piping is not limited to connecting just two commands. You may connect more commands as long as the output of one command can be used as the input of the next command.
Remember the stdout/stdin is a chunk of data, not filenames
Some new Linux users get confused while using the redirection. If a command returns a bunch of filenames as output, you cannot use those filenames as argument.
For example, if you use the find command to find all the files ending with .txt, you cannot pass it through pipe to move the found files to a new directory, not directly like this:
This is why you’ll often see find command used in conjugation with exec or xargs command. These special commands ‘convert the text with bunch of filenames into filename’ that can be passed as argument.
The input redirection
You can use stdin redirection to pass the content of a text file to a command like this:
You won’t see stdin being used a lot. It’s because most Linux commands accept filenames as argument and thus the stdin redirection is often not required.
Take this for example:
The above command could have just been head filename.txt (without the or >> redirection symbol that you used for stdout redirection.
But how do you distinguish between the stdout and stderr when they are both output data stream? By their stream ID (also called file descriptor).
Data Stream | Stream ID |
---|---|
stdin | 0 |
stdout | 1 |
stderr | 2 |
-t, | –list |
-u, | –update |
-x, | –extract, –get |
-j, | –bzip2 |
-z, | –gzip, –gunzip, –ungzip |
By default when you use the output redirection symbol >, it actually means 1>. In words, you are saying that data stream with ID 1 is being outputted here.
When you have to redirect the stderr, you use its ID like 2> or 2>>. This signifies that the output redirection is for data stream stderr (ID 2).
Stderr redirection examples
Let me show it to you with some examples. Suppose you just want to save the error, you can use something like this:
That was simple. Let’s make it slightly more complicated (and useful):
In the above example, the ls command tries to display two files. For one file it gets success and for the other, it gets error. So what I did here is to redirect the stdout to ouput.txt (with >) and the stderr to the error.txt (with 2>).
You can also redirect both stdout and stderr to the same file. There are ways to do that.
In the below example, I first send the stderr (with 2>>) to combined.txt file in append mode. And then, the stdout (with >>) is sent to the same file in append mode.
Another way, and this is the preferred one, is to use something like 2>&1. Which can be roughly translated to “redirect stderr to the same address as stdout”.
Let’s take the previous example and this time use the 2>&1 to redirect both of the stdout and stderr to the same file.
Keep in mind that you cannot use 2>>&1 thinking of using it in append mode. 2>&1 goes in append mode already.
You may also use 2> first and then use 1>&2 to redirect stdout to same file as stderr. Basically, it is “>&” which redirects one out data stream to another.
Summary
- There are three data streams. One input, stdin (0) and two output data streams stdout (1) and stderr (2).
- Keyboard is the default stdin device and the screen is the default output device.
- Output redirection is used with > or >> (for append mode).
- Input redirection is used with or 2>>.
- The stderr and stdout can be combined using 2>&1.
Since you are learning about redirection, you should also know about the tee command. This command enables you to display to standard output and save to file simultaneously.
I hope you liked this detailed guide on redirection in Linux. If you still have doubts or if you have suggestions to improve this article, please let me know in the comment section.
Источник