Найти тему

Bash: перенаправление вывода

Оглавление

1. Введение

В данной статье рассматривается механизм перенаправления вывода запущенной программы, используя оболочку Bash. Все команды будут выполнятся с использованием подсистемы Windows для Linux (WSL). В качестве дистрибутива используется Ubuntu.

2. Перенаправляем stdout в файл

Для работы с примерами нам потребуется программа, которая, в процессе выполнения, выводит какие-то данные в стандартный вывод (stdout). Для простоты, воспользуемся программой test_program.exe, написанную на языке программирования Rust, которая просто выводит строку "Hello, world!" в консоль (см. рис.1).

рис.1 Hello world
рис.1 Hello world

Запустим программу: $ ./test_program.exe

В консоли отобразиться вывод: Hello, world!

Воспользуемся перенаправлением:

$ ./test_program.exe > stdout.txt

В этом случае вывод будет записан в файл, а не в консоль.

  • Стрелка > перенаправляет вывод программы в файл stdout.txt.
  • Если этот файл не существует, он будет создан.
  • Если файл существует, он будет перезаписан.

2. Перенаправляем stdout в конец файла

Если вы не хотите перезаписывать файл, то можно воспользоваться похожей командой:

$ ./test_program.exe >> stdout.txt

  • Две стрелки >> также перенаправляют вывод программы в файл stdout.txt.
  • Если этот файл не существует, он будет создан.
  • Если файл существует, то вывод программы будет добавлен в конец файла.

3. Перенаправляем stderr в файл

Для следующего примера немного изменим программу test_program, добавив вывод в stderr (см. рис.2).

рис.2 Вывод в stdout и stderr
рис.2 Вывод в stdout и stderr

При выполнении команды $ ./test_program.exe > stdout.txt сообщение Hello, world! будет записано в файл как и прежде, а строка Вывод в stderr отобразиться в консоли.

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

$ ./test_program.exe 2> stderr.txt

  • Стрелка с числом 2> перенаправляет вывод программы в файл stderr.txt.
  • Если этот файл не существует, он будет создан.
  • Если файл существует, он будет перезаписан.

После выполнения этой команды, теперь уже Hello, world! будет отображаться в консоли, а Вывод в stderr будет записано в файл.

В данном случае, 2 означает файловый дескриптор 2 - stderr. Также есть файловый дескриптор 0 - stdin, и файловый дескриптор 1 - stdout.

4. Перенаправляем stdout и stderr в разные файлы

Если вам требуется перенаправить и стандартный вывод программы и сообщения об ошибках, можете воспользоваться следующей командой:

$ ./test_program.exe > stdout.txt 2> stderr.txt

Стандартный вывод будет перенаправлен в файл stdout.txt, а ошибки в stderr.txt.

5. Перенаправляем stdout и stderr в один файл

Если вам требуется записать оба вывода в один файл, можно воспользоваться такой командой:

$ ./test_program.exe > output.txt 2>&1

Это позволит отправить stderr (2) в то же место, что и файловый дескриптор 1 (&1).

Или короче: $ ./test_program.exe &> output.txt

Без перезаписи файла: $ ./test_program.exe &>> output.txt

6. Вывод и в консоль и в файл

Чтобы одновременно видеть результаты в консоли и перенаправлять вывод в файл, можно воспользоваться командой tee:

$ ./test_program.exe | tee stdout.txt

Без перезаписи файла: $ ./test_program.exe | tee -a stdout.txt

В консоли отобразится 2 строки:

  1. Вывод в stderr
  2. Hello, world!

А в файле только строка из stdout.

7. Список используемых команд

  1. $ ./test_program.exe > stdout.txt
  2. $ ./test_program.exe >> stdout.txt
  3. $ ./test_program.exe 2> stderr.txt
  4. $ ./test_program.exe > stdout.txt 2> stderr.txt
  5. $ ./test_program.exe > output.txt 2>&1
  6. $ ./test_program.exe &> output.txt
  7. $ ./test_program.exe &>> output.txt
  8. $ ./test_program.exe | tee stdout.txt
  9. $ ./test_program.exe | tee -a stdout.txt

Заключение

На этом все. Спасибо, что дочитали до конца. Ставьте лайки, подписывайтесь на канал и приходите снова.