Операционные системы Unix традиционно используют такие понятия, как стандартный ввод, вывод и вывод ошибки. Чаще всего ввод — это клавиатура, а вывод это на кран. Но конечно же мы можем выводить исполнение какой-то команды в файл и передавать другой команде, потому что работая в Linux, создается такая последовательность из команд, т.е результат предыдущей мы отправляем следующей и т.д
Целью данной статьи является рассмотреть:
- Перенаправление стандартных ввода, вывода и ошибок;
- Передача вывода одной команды в качестве аргументов другой;
- Получение выходных данных в файл и на стандартный вывод;
Основные понятия:
Stdin (0)
– вводStdout(1)
– выводStderr (2)
– вывод ошибки>
- передать в>>
- дописать в<
- взять из|
- отправить следующей командеTee
- отправить в файл и на стандартный выводXargs
– построчно передать на ввод команде
Для начала воспользуемся командой wc
которая посчитает, количество слов, символов и строк в файле wc test.txt
.
Мы можем указать данной команде другой input
. Мы можем ей сказать взять информацию из файла, т.е. записать вот таким образом wc < test.txt
т.е. данной команде передать информацию из этого файла. И данная команда отработав посчитает в принципе то же самое. В таком варианте команда не знает с каким файлом она работает ей просто поступает вывод из файла. Файл выводит свой результат этой команде. Такая стрелочка редко используется, чаще используется стрелка в другую сторону. Например, мы можем список файлов вывести командой ls
. А можем сказать, чтобы данная команда отправила результат не на наш стандартный вывод т.к. результат всех наших команд по умолчанию выводится в консоль, а например в файл ls > list.txt
. По сути означает выполнить команду, а результат передать в файл. Фал можно посмотреть командой cat list.txt
.
И мы можем убедится, что в данном файле находится перечень, всего что находилось в данной папке. Если мы выполним еще раз команду ls > list.txt
, то данный файл каждый раз будет перезаписываться. Если же мы хотим, чтобы наш файл не перезаписывался, а дописывался, используем другую стрелочку ls >> list.txt
.
И теперь вы можете видеть, что файл стал больше. Т.е. у нас записалось, то что было, а затем еще раз добавилось. Если опять выполнить команду со стрелочками >>
, то опять допишется информация в файл. Вот таким образом работают “стрелочки”.
Стандартный вывод ошибок.
Мы можем, например, сказать машине, выведи нам содержимое папки bob
, которая не существует ls bob > result.txt
, естественно мы получим ошибку которую система вывела на экран. Экран является стандартным выводом ошибок. В нашем случае нет папки bob
и нет файла resut.txt
. Если мы хотим отправить ошибку в файл, так же как результат выполнения команды, то ls bob 2> result.txt
, вспоминаем основные понятия, в которых было указанно, что 2
– это стандартный вывод ошибки.
Следовательно, на экране мы уже не видим ошибки, потому что она отправилась в указанный файл.
Кстати мы можем объединить стандартный вывод команды и стандартный вывод ошибки. Например: ls bob > result.txt 2> error.txt
. Выведи содержимое папки bob
в файл result.txt
, а если возникнет ошибка внеси в файл error.txt
.
В таком случае и команда выполнится и что-то будет в файле и если ошибка возникнет, то она будет записана в файл error.txt
. Это можно применять на практике, когда мы что-то делаем и предполагаем, что в процессе выполнения возникнут ошибки, то используя данную конструкцию данные ошибки мы все можем отправить в отдельный файл.
Конвейер
Конвейер умеет передавать выходные данные из одной программы, как входные данные для другой. Т.е. выполняется команда, мы получаем результат и передаем эти данные далее на обработку другой программе.
Например, выполнить команду ls
и далее мы могли стрелочкой отправлять результаты выполнения команды в файл, т.е. мы меняли только стандартный вывод, а не передавали другой программе. А можем выполнить ls | grep r
, т.е. получить содержимое и передать по конвейеру команде сортировки и сказать отсортировать по наличию буквы r
, а если перенаправить еще вывод в файл, то cat имя файла
, мы сможем увидеть информацию в файле.
Но есть другая команда tee которая позволяет работать немного удобнее. Например: ls | tee output.txt
. Те данная команда выводит информацию сразу на экран и в указанный файл. Что достаточно удобно с точки зрения работы с выводами.
xargs
– она построчно работает с выводами. Если у нас есть какая-то команда, которая выдает нам вывод в виде нескольких строк ответа, то мы можем эти строки построчно передавать этой команде, т.е. не одной кашей, а построчно. Например find . –name “*.txt”
найти все файлы в текущем каталоге с расширением txt
. И если бы мы захотели удалить все эти файлы нам бы пришлось построчно их удалять, но мы можем сказать, чтобы выходные данные были переданы по конвейеру xargs
и удалить.
find . –name “*.txt” | xargs rm -f
Как видите после данной конструкции команд файлов не осталось. Т.е. данные построчно передались на команду удаления, которая построчно каждый файл с ключом –f
(принудительно) их и удалила.