- Как перенаправить stderr на stdout в Bash
- Перенаправление вывода
- Перенаправление stderr на stdout
- Выводы
- BASH Shell Redirect stderr To stdout ( redirect stderr to a File )
- Understanding I/O streams numbers
- Redirecting output
- Redirecting the standard error stream to a file
- Redirecting the standard error (stderr) and stdout to file
- Redirecting stderr to stdout to a file or another command
- Redirect stderr to stdout
- How to redirect stderr to stdout in Bash script
- Want both stderr and stdout to the terminal and a log file too?
- Conclusion
- Перенаправление ввода вывода Linux
- Как работает перенаправление ввода вывода
- Перенаправить вывод в файл
- Перенаправить ошибки в файл
- Перенаправить стандартный вывод и ошибки в файл
- Стандартный ввод из файла
- Использование тоннелей
- Выводы
Как перенаправить stderr на stdout в Bash
При перенаправлении вывода команды в файл или передаче его по конвейеру другой команде вы можете заметить, что сообщения об ошибках выводятся на экран.
В Bash и других оболочках Linux при выполнении программы используются три стандартных потока ввода-вывода. Каждый поток представлен числовым дескриптором файла:
- 0 — stdin , стандартный поток ввода.
- 1 — stdout , стандартный поток вывода.
- 2 — stderr , стандартный поток ошибок.
Дескриптор файла — это просто число, представляющее открытый файл.
Входной поток предоставляет информацию программе, как правило, путем ввода с клавиатуры.
Выходные данные программы попадают в стандартный поток ввода, а сообщения об ошибках — в стандартный поток ошибок. По умолчанию на экран выводятся потоки ввода и ошибки.
Перенаправление вывода
Перенаправление — это способ захватить вывод программы и отправить его в качестве ввода в другую программу или файл.
Потоки могут быть перенаправлены с помощью оператора n> , где n — номер дескриптора файла.
Если n опущено, по умолчанию используется 1 , стандартный выходной поток. Например, следующие две команды одинаковы; оба будут перенаправлять вывод команды ( stdout ) в файл.
Чтобы перенаправить стандартную ошибку ( stderr ), используйте оператор 2> :
Вы можете записать как stderr и stdout в два отдельных файла:
Чтобы сообщения об ошибках не отображались на экране, перенаправьте stderr на /dev/null :
Перенаправление stderr на stdout
При сохранении вывода программы в файл довольно часто перенаправляют stderr на stdout чтобы у вас было все в одном файле.
Чтобы перенаправить stderr на stdout и отправлять сообщения об ошибках в тот же файл, что и стандартный вывод, используйте следующее:
> file перенаправляет stdout в file , а 2>&1 перенаправляет stderr в текущее расположение stdout .
Порядок перенаправления важен. Например, в следующем примере в file перенаправляется только стандартный stdout . Это происходит потому, что стандартный stderr перенаправляется на стандартный stdout до того, как стандартный stdout был перенаправлен в file .
Другой способ перенаправить stderr на stdout — использовать конструкцию &> . В Bash &> имеет то же значение, что и 2>&1 :
Выводы
Понимание концепции перенаправлений и файловых дескрипторов очень важно при работе в командной строке.
Чтобы перенаправить stderr и stdout , используйте конструкции 2>&1 или &> .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник
BASH Shell Redirect stderr To stdout ( redirect stderr to a File )
Tutorial requirements | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Requirements | Unix or Linux with bash | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Root privileges | No | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Difficulty | Easy | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Est. reading time | 6 mintues | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Handle | Name | Description |
0 | stdin | Standard input |
1 | stdout | Standard output |
2 | stderr | Standard error |
Redirecting output
Redirecting the standard error stream to a file
The following will redirect program error message to a file called error.log:
$ program-name 2> error.log
$ command1 2> error.log
For example, use the grep command for recursive search in the $HOME directory and redirect all errors (stderr) to a file name grep-errors.txt as follows:
$ grep -R ‘MASTER’ $HOME 2> /tmp/grep-errors.txt
$ cat /tmp/grep-errors.txt
Sample outputs:
Redirecting the standard error (stderr) and stdout to file
Use the following syntax:
$ command-name &>file
We can als use the following syntax:
$ command > file-name 2>&1
We can write both stderr and stdout to two different files too. Let us try out our previous grep command example:
$ grep -R ‘MASTER’ $HOME 2> /tmp/grep-errors.txt 1> /tmp/grep-outputs.txt
$ cat /tmp/grep-outputs.txt
Redirecting stderr to stdout to a file or another command
Here is another useful example where both stderr and stdout sent to the more command instead of a file:
# find /usr/home -name .profile 2>&1 | more
Redirect stderr to stdout
Use the command as follows:
$ command-name 2>&1
$ command-name > file.txt 2>&1
## bash only ##
$ command2 &> filename
$ sudo find / -type f -iname «.env» &> /tmp/search.txt
Redirection takes from left to right. Hence, order matters. For example:
command-name 2>&1 > file.txt ## wrong ##
command-name > file.txt 2>&1 ## correct ##
How to redirect stderr to stdout in Bash script
A sample shell script used to update VM when created in the AWS/Linode server:
- No ads and tracking
- In-depth guides for developers and sysadmins at Opensourceflare✨
- Join my Patreon to support independent content creators and start reading latest guides:
- How to set up Redis sentinel cluster on Ubuntu or Debian Linux
- How To Set Up SSH Keys With YubiKey as two-factor authentication (U2F/FIDO2)
- How to set up Mariadb Galera cluster on Ubuntu or Debian Linux
- A podman tutorial for beginners – part I (run Linux containers without Docker and in daemonless mode)
- How to protect Linux against rogue USB devices using USBGuard
Join Patreon ➔
Our last example uses the exec command and FDs along with trap and custom bash functions:
Want both stderr and stdout to the terminal and a log file too?
Try the tee command as follows:
command1 2>&1 | tee filename
Here is how to use it insider shell script too:
Conclusion
In this quick tutorial, you learned about three file descriptors, stdin, stdout, and stderr. We can use these Bash descriptors to redirect stdout/stderr to a file or vice versa. See bash man page here:
Operator | Description | Examples |
---|---|---|
command>filename | Redirect stdout to file “filename.” | date > output.txt |
command>>filename | Redirect and append stdout to file “filename.” | ls -l >> dirs.txt |
command 2>filename | Redirect stderr to file “filename.” | du -ch /snaps/ 2> space.txt |
command 2>>filename | Redirect and append stderr to file “filename.” | awk ‘< print $4>‘ input.txt 2>> data.txt |
command &>filename command >filename 2>&1 | Redirect both stdout and stderr to file “filename.” | grep -R foo /etc/ &>out.txt |
command &>>filename command >>filename 2>&1 | Redirect both stdout and stderr append to file “filename.” | whois domain &>>log.txt |
🐧 Get the latest tutorials on Linux, Open Source & DevOps via
Category | List of Unix and Linux commands |
---|---|
Documentation | help • mandb • man • pinfo |
Disk space analyzers | df • duf • ncdu • pydf |
File Management | cat • cp • less • mkdir • more • tree |
Firewall | Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04 |
Linux Desktop Apps | Skype • Spotify • VLC 3 |
Modern utilities | bat • exa |
Network Utilities | NetHogs • dig • host • ip • nmap |
OpenVPN | CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04 |
Package Manager | apk • apt |
Processes Management | bg • chroot • cron • disown • fg • glances • gtop • jobs • killall • kill • pidof • pstree • pwdx • time • vtop |
Searching | ag • grep • whereis • which |
Shell builtins | compgen • echo • printf |
Text processing | cut • rev |
User Information | groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w |
WireGuard VPN | Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04 |
Comments on this entry are closed.
What this mean?
$ command > file-name 2>&1
This means redirect stdout to file-name, with that in mind redirect stderr t stdout.
This will lead to both stderr and stdout go to file-name.
Sayed: that line means execute the command while redirecting both stdout and stderr to a file given by file-name.
A slightly more correct is:
The output of the ‘command’ is redirected to a ‘file-name’ and the error chanel (that is the ‘2’ is redirected to a pointer (?) of the output (‘&1’).
So stderr goes to the stdout and that goes to the file.
Actually it means “first redirect STDERR to STDOUT, so any errors printed out on STDERR should go to STDOUT. Then, execute ‘command’ and redirect its STDOUT to ‘file-name’” – keeping in mind that at this point STDOUT will also contain whatever is written to STDERR because of the earlier redirection.
Incorrect.
There are two incorrect concepts in your answer.
First is: the redirection happens from left to right. This means that the STDOUT is redirected first.
(When you have > without a stream number, it actually have an implicit 1)
And only after STDERR is redirected to “the same place STDOUT is pointing”, meaning, ‘file-name’
Second wrong concept with your answer is: There are no connection between the descriptors. Changing STDOUT after STDERR had been redirected to STDOUT won’t change STDERR.
It will make STDERR point to STDOUT and then change STDOUT to something else (without touching STDERR)
Here is a more detailed tutorial covering both those misconceptions
http://wiki.bash-hackers.org/howto/redirection_tutorial
I like the &>file one. but not for every stiuation.
In pre-bash4 days you HAD to do it this way:
cat file > file.txt 2>&1
now with bash 4 and greater versions… you can still do it the old way …but …
cat file &> file.txt
The above is bash4+ … some OLD distros may use prebash4 but I think they are alllong gone by now. Just something to keep in mind.
I really love: “ command2>&1 | tee logfile.txt ”
because tee log’s everything and prints to stdout . So you stil get to see everything! You can even combine sudo to downgrade to a log user account and add date’s subject and store it in a default log directory 🙂
Hi! good explanation, I’d like to make a function on C that redirects STDIN and SDTOUT to an script, how can I do that, I mean, the exist a library’s on C to put terminal sintaxis on C?, how would you start to do it? I’m very lost with this. Thankyou!
Источник
Перенаправление ввода вывода Linux
Одна из самых интересных и полезных тем для системных администраторов и новых пользователей, которые только начинают разбираться в работе с терминалом — это перенаправление потоков ввода вывода Linux. Эта особенность терминала позволяет перенаправлять вывод команд в файл, или содержимое файла на ввод команды, объединять команды вместе, и образовать конвейеры команд.
В этой статье мы рассмотрим как выполняется перенаправление потоков ввода вывода в Linux, какие операторы для этого используются, а также где все это можно применять.
Как работает перенаправление ввода вывода
Все команды, которые мы выполняем, возвращают нам три вида данных:
- Результат выполнения команды, обычно текстовые данные, которые запросил пользователь;
- Сообщения об ошибках — информируют о процессе выполнения команды и возникших непредвиденных обстоятельствах;
- Код возврата — число, которое позволяет оценить правильно ли отработала программа.
В Linux все субстанции считаются файлами, в том числе и потоки ввода вывода linux — файлы. В каждом дистрибутиве есть три основных файла потоков, которые могут использовать программы, они определяются оболочкой и идентифицируются по номеру дескриптора файла:
- STDIN или 0 — этот файл связан с клавиатурой и большинство команд получают данные для работы отсюда;
- STDOUT или 1 — это стандартный вывод, сюда программа отправляет все результаты своей работы. Он связан с экраном, или если быть точным, то с терминалом, в котором выполняется программа;
- STDERR или 2 — все сообщения об ошибках выводятся в этот файл.
Перенаправление ввода / вывода позволяет заменить один из этих файлов на свой. Например, вы можете заставить программу читать данные из файла в файловой системе, а не клавиатуры, также можете выводить ошибки в файл, а не на экран и т д. Все это делается с помощью символов » «.
Перенаправить вывод в файл
Все очень просто. Вы можете перенаправить вывод в файл с помощью символа >. Например, сохраним вывод команды top:
top -bn 5 > top.log
Опция -b заставляет программу работать в не интерактивном пакетном режиме, а n — повторяет операцию пять раз, чтобы получить информацию обо всех процессах. Теперь смотрим что получилось с помощью cat:
Символ «>» перезаписывает информацию из файла, если там уже что-то есть. Для добавления данных в конец используйте «>>». Например, перенаправить вывод в файл linux еще для top:
top -bn 5 >> top.log
По умолчанию для перенаправления используется дескриптор файла стандартного вывода. Но вы можете указать это явно. Эта команда даст тот же результат:
top -bn 5 1>top.log
Перенаправить ошибки в файл
Чтобы перенаправить вывод ошибок в файл вам нужно явно указать дескриптор файла, который собираетесь перенаправлять. Для ошибок — это номер 2. Например, при попытке получения доступа к каталогу суперпользователя ls выдаст ошибку:
Вы можете перенаправить стандартный поток ошибок в файл так:
ls -l /root/ 2> ls-error.log
$ cat ls-error.log
Чтобы добавить данные в конец файла используйте тот же символ:
ls -l /root/ 2>>ls-error.log
Перенаправить стандартный вывод и ошибки в файл
Вы также можете перенаправить весь вывод, ошибки и стандартный поток вывода в один файл. Для этого есть два способа. Первый из них, более старый, состоит в том, чтобы передать оба дескриптора:
ls -l /root/ >ls-error.log 2>&1
Сначала будет отправлен вывод команды ls в файл ls-error.log c помощью первого символа перенаправления. Дальше в тот же самый файл будут направлены все ошибки. Второй метод проще:
ls -l /root/ &> ls-error.log
Также можно использовать добавление вместо перезаписи:
ls -l /root/ &>> ls-error.log
Стандартный ввод из файла
Большинство программ, кроме сервисов, получают данные для своей работы через стандартный ввод. По умолчанию стандартный ввод ожидает данных от клавиатуры. Но вы можете заставить программу читать данные из файла с помощью оператора » cat
Вы также можете сразу же перенаправить вывод тоже в файл. Например, пересортируем список:
Таким образом, мы в одной команде перенаправляем ввод вывод linux.
Использование тоннелей
Можно работать не только с файлами, но и перенаправлять вывод одной команды в качестве ввода другой. Это очень полезно для выполнения сложных операций. Например, выведем пять недавно измененных файлов:
ls -lt | head -n 5
С помощью утилиты xargs вы можете комбинировать команды таким образом, чтобы стандартный ввод передавался в параметры. Например, скопируем один файл в несколько папок:
echo test/ tmp/ | xargs -n 1 cp -v testfile.sh
Здесь параметр -n 1 задает, что для одной команды нужно подставлять только один параметр, а опция -v в cp позволяет выводить подробную информацию о перемещениях. Еще одна, полезная в таких случаях команда — это tee. Она читает данные из стандартного ввода и записывает в стандартный вывод или файлы. Например:
echo «Тест работы tee» | tee file1
В сочетании с другими командами все это может использоваться для создания сложных инструкций из нескольких команд.
Выводы
В этой статье мы рассмотрели основы перенаправления потоков ввода вывода Linux. Теперь вы знаете как перенаправить вывод в файл linux или вывод из файла. Это очень просто и удобно. Если у вас остались вопросы, спрашивайте в комментариях!
Источник