1. Введение
В данной статье рассматривается механизм перенаправления вывода запущенной программы, используя оболочку Bash. Все команды будут выполнятся с использованием подсистемы Windows для Linux (WSL). В качестве дистрибутива используется Ubuntu.
2. Перенаправляем stdout в файл
Для работы с примерами нам потребуется программа, которая, в процессе выполнения, выводит какие-то данные в стандартный вывод (stdout). Для простоты, воспользуемся программой test_program.exe, написанную на языке программирования Rust, которая просто выводит строку "Hello, world!" в консоль (см. рис.1).
Запустим программу: $ ./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).
При выполнении команды $ ./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 строки:
- Вывод в stderr
- Hello, world!
А в файле только строка из stdout.
7. Список используемых команд
- $ ./test_program.exe > stdout.txt
- $ ./test_program.exe >> stdout.txt
- $ ./test_program.exe 2> stderr.txt
- $ ./test_program.exe > stdout.txt 2> stderr.txt
- $ ./test_program.exe > output.txt 2>&1
- $ ./test_program.exe &> output.txt
- $ ./test_program.exe &>> output.txt
- $ ./test_program.exe | tee stdout.txt
- $ ./test_program.exe | tee -a stdout.txt
Заключение
На этом все. Спасибо, что дочитали до конца. Ставьте лайки, подписывайтесь на канал и приходите снова.