Давайте посмотрим, как стандартный ввод , stderr , а также стандартный вывод работает, и как вы можете их использовать.
stdin, stdout и stderr
В вычислениях термин поток относится к чему-то, что может передавать данные. Здесь все три потока несут текст в качестве данных.
Подобно водным потокам, потоки данных также имеют две конечные точки. Есть источник и отток. Какая бы команда вы ни запускала в терминале, она будет в любой точке потока. Используя поток, вы можете соединить два окна терминала, две разные команды и даже файлы!
Давайте вкратце разберем специальные потоки.
- stdin: обозначает стандартный ввод. Он принимает текст в качестве ввода.
- stdout: обозначает стандартный вывод. Текстовый вывод команды сохраняется в потоке stdout.
- stderr: обозначает стандартную ошибку. Каждый раз, когда команда сталкивается с ошибкой, сообщение об ошибке сохраняется в этом потоке.
В Linux почти все потоки обрабатываются как файлы. Так же, как вы можете читать / писать файл, вы можете читать / писать данные из этих потоков.
Самый простой способ получить доступ к любому файлу - использовать связанный с ним уникальный номер дескриптора файла. В случае этих потоков каждому из них присваиваются уникальные значения.
- 0: стандартный ввод
- 1: стандартный вывод
- 2: stderr
stdin, stdout и stderr в действии
Давайте начнем с того, что узнаем больше об этих потоках через действие, мы начнем с stdin.
Выполните следующую команду.
$читать
Команда потребует ввода с клавиатуры. Здесь инструмент чтения получает ввод от стандартного ввода. Теперь посмотрим на стандартный вывод.
Сначала запустите команду.
$ls -
Здесь команда ls выводит список файлов в текущем каталоге. Список отправлен стандартный вывод и терминал его распечатает. Давайте сейчас проверим stderr.
Есть разные способы возникновения ошибки. В этом примере отправка ls недопустимого аргумента приведет к ошибке.
$ls -что-нибудь
Здесь нет файла с каким-либо именем. Вот почему сообщение ls returns отправляется на stderr .
Трубопровод
Это распространенный метод, который в полной мере использует потоки stdin и stdout. Поясним это на примере.
$выбросил 'Привет, мир' | рукояткаПривет
Здесь | знак отвечает за обвязку. Выход выбросил генерирует записано в стандартный вывод транслировать. Затем конвейер перенаправляет содержимое stdout на stdin для команды grep. Вот как grep узнает, с каким контентом выполнять операцию.
Если вы хотите передать и stderr, и stdout следующей команде, используйте вместо этого | &.
$выбросилПривет, мир| & Кот$что-нибудь| & Кот
Перенаправление потоков
Теперь мы знаем, как работают эти потоки, давайте посмотрим, как их можно перенаправить. Трубопровод - это форма перенаправления. Однако он включает только stdin и stdout. Bash позволяет контролировать все три потока.
Чтобы перенаправить содержимое стандартного вывода в файл, добавьте угол>, за которым следует имя целевого файла.
$выбросилПривет, мир>hello.txt
Здесь вывод команды echo будет сохранен в файле hello.txt.
Если файл уже существует, то приведенная выше команда перезапишет его. Чтобы этого избежать, убедитесь, что имя файла уникально. Если вы не хотите перезаписывать, вы можете вместо этого использовать >>. Он добавляет вывод в конец целевого файла.
$выбросил 'Привет, мир' >>hello.txt
Цель stdin - работать с вводом. Это также можно перенаправить. Например, вместо ввода ввода с клавиатуры его можно загрузить из файла.
В этой команде cat будет вводить данные непосредственно из файла hello.txt.
$Кот <hello.txt
Давайте проверим перенаправление на другом примере. На этот раз будет задействован скрипт Python.
$# pyin.py$ nameзнак равно Вход('Введите имя п')
$Эл. адрес знак равно Вход('Введите адрес электронной почты п')
$Распечатать('Ваше имя% s, а адрес электронной почты% s'%(имя, Эл. адрес))
Вход для сценария находится в hello.txt.
$Котhello.txt
Давайте отправим файл в качестве входных данных для скрипта.
$ python3 pyin.ру <Привет.текст
Интересно, что вы можете перенаправить оба стандартный ввод а также стандартный вывод в той же командной строке. Здесь следующая команда будет использовать hello.txt как стандартный ввод и отправьте стандартный вывод команды в файл.
$ python3 pyin.ру <Привет.текст >выход.текст
Перенаправление stderr похоже на stdout. Однако вам необходимо указать идентификатор описания 2 для указания stderr. В противном случае будет использоваться стандартный вывод.
Здесь я перенаправляю содержимое stderr в текстовый файл.
$что-нибудь2>error.txt
Перенаправление Stdout и Stderr
Да, их можно перенаправить одновременно. Все, что вам нужно, это указать ID описания 1 и 2 перед перенаправлением.
$выбросилПривет, мир1>output.log2>debug.log
Последние мысли
стандартный ввод , стандартный вывод , а также stderr замечательные функции, которые bash предлагает по умолчанию. Если вы занимаетесь написанием сценариев bash, их использование может быть невероятно полезным в сложных ситуациях.
Хотите узнать больше о сценариях bash? Давай начнем с этого руководство для начинающих по написанию сценариев на bash !
Наслаждаться!