Text-Fu [Часть 1]

Прошлый курс довольно неплохо был воспринят аудиторией нашего сообщества. Поэтому решил далее перевести курс по базовой обработке текста. Кроме того, прошлый перевод теперь доступен на самом linuxjourney.com! Приятного чтения.

1. stdout (Standard Out / стандартный вывод)

Сейчас мы знакомы с многими командами и их выводом, и теперь нам предстоит перейти в следующую тему I/O (input/output, ввод/вывод) потоков. Давайте запустим следующую команду и обсудим, как она работает.

$ echo Hello World > peanuts.txt

Что только что произошло? Давайте проверим директорию, откуда вы запустили эту команду, и вот вы должны увидеть файл, названный peanuts.txt, посмотрим внутрь этого файла и увидим строку Hello World. В этой команде произошло множество вещей, давайте разберем их.

Во-первых, разберем эту часть:

$ echo Hello World

Мы знаем, что эта команда выведет на экран Hello World, но как? Процессы используют I/O потоки, чтобы получить или вернуть вывод. По-умолчанию команда echo берет ввод (стандартный ввод или stdin (standard input)) с клавиатуры и возвращает вывод (стандартный вывод или stdout(standard output)) на экран. Так вот, это то, почему когда вы вводите echo Hello World в вашей консоли, вы получаете Hello World на вашем экране. Однако, перенаправление I/O позволяет нам изменить это поведение по-умолчанию, давая нам большую гибкость при манипуляции с файлами.

Давайте перейдем к следующей части нашей команды:

> - оператор перенаправления, который позволяет нам изменять направление стандартного вывода. Он позволяет нам направить вывод echo Hello World в файл, вместо экрана. Если файл не существуют, то таковой будет создан. Однако, если он существует, то он будет перезаписан (вы можете добавить флаг для предотвращения этой ситуации в зависимости от оболочки, которую вы используете).

Вот так работает перенаправление stdout!

Давайте скажем, что мы не хотим перезаписывать наш peanuts.txt, к счастью, существует оператор перенаправления, такой как >>:

$ echo Hello World >> peanuts.txt

Это добавит Hello World в конец файла peanuts.txt, если файла еще не существует, то он будет создан, также как и в случае с оператором >!

Упражнения:

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

2. stdin (Standard Input / стандартный ввод)

В предыдущем уроки мы узнали, что у нас есть различные stdout потоки, которые мы используем, такие как файл или экран. Существуют также различные потоки стандартного ввода (stdin / standart input, stdin / стандартный ввод). Мы знаем, что у нас есть stdin с таких устройств, как клавиатура, но мы можем использовать файлы, вывод из других процессов, а также терминал, давайте посмотрим на пример.

Мы будем использовать файл peanuts.txt из предыдущего урока, вспомните, что у нас есть текст Hello World в нем.

$ cat < peanuts.txt > banana.txt

Точно также, как и в случае с > для перенаправления stdout, мы можем использовать < для перенаправления stdin.

Обычно, используя команду cat, вы посылаете в нее файл и этот файл становится stdin, в этом случае мы перенаправили peanuts.txt, чтобы он стал нашим stdin. Затем перенаправили вывод cat peanuts.txt, который будет Hello World, в другой файл, названный banana.txt.

3. stderr (Standard Error / стандартная ошибка)

Давайте попробуем что-нибудь другое, давайте попробуем вывести список содержимого директории, которая не существует на вашей системе и перенаправим вывод в файл peanuts.txt снова.

$ ls /fake/directory > peanuts.txt

Что вы должны увидеть:

ls: cannot access /fake/directory: No such file or directory

Сейчас вы возможно думаете, должно ли это сообщение отправиться в файл? Существует другой I/O поток, который называется стандартной ошибкой (stderr / standart error). По-умолчанию stderr отправляет его вывод на экран, но это совершенно другой поток, по отношению к stdout. Так что вам нужно перенаправить его другим способом.

К сожалению, редиректор не такой приятный, как < или >, но довольно близок к этому. Нам нужно использовать дескрипторы файлов. Дескриптор файла - неотрицательное число, которое используется для доступа к файлу или потоку. Мы узнаем об этом подробнее позже, но сейчас вам достаточно знать, что дескрипторы файлов для stdin, stdout и stderr  - 0, 1 и2 соответственно.

Так вот, если мы хотим перенаправить наш stderr в файл, мы можем использовать это:

$ ls /fake/directory 2> peanuts.txt

Вы должны увидеть только stderr сообщения в peanuts.txt.

Что если я хочу увидеть stderr и stdout в одном файле? Это возможно, с дескрипторами файлов:

$ ls /fake/directory > peanuts.txt 2>&1

Это отправит результат ls /fake/directory в файл peanuts.txt, а затем перенаправит stderr в stdout по 2>&1. Важен порядок операций, 2>&1 отправляет stderr в направленный стандартный вывод. В этом случае stdout нацелен на файл, так что 2>&1 также отправит stderr в файл. Теперь если вы откроете peanuts.txt, вы увидите и stderr, и stdout. В нашем случае, команда выше выводит только stderr.

Существует более короткий способ перенаправить stdout и stderr в файл:

$ ls /fake/directory &> peanuts.txt

Теперь, что если я не хочу весь этот хлам и хочу полностью избавиться от сообщений stderr? Вы можете перенаправить вывод в специальный файл, называнный /dev/null, который уничтожает любой ввод.

ls /fake/directory 2> /dev/null

GNU/Linux

1K поста15.5K подписчика

Добавить пост

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

Автор поста оценил этот комментарий
Мы узнаем об этом глубже позже

Лично я не с первого раза понял это предложение.

Может как-нибудь заменить?

раскрыть ветку
Автор поста оценил этот комментарий

Кроме того, прошлый перевод теперь доступен на самом linuxjourney.com!

Это замечательно!

раскрыть ветку