Иногда вы хотите перенаправить как stdout, так и stderr в одно и то же место. Это когда >&
используется - он указывает один дескриптор файла на другой.
Например, если вы хотите записать и stdout, и stderr в один и тот же файл (будь то /dev/null
или output.txt
), вы можете перенаправить их отдельно, с помощью
app 1>/dev/null 2>/dev/null
или вы можете перенаправить один файловый дескриптор в файл, а другой файловый дескриптор - в первый:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
В первом примере 2>&1
указатель дескриптора файла № 2 указывает на то место, где номер 1 уже указывает. Второй пример достигает того же самого, просто вместо этого начинается с stderr.
В качестве другого примера, есть случаи, когда stdout (дескриптор файла # 1) уже указывает на желаемое местоположение, но вы не можете ссылаться на него по имени (это может быть связано с каналом, сокетом или подобным). Это часто происходит, когда используется расширение процесса ( операторы ` `
or $( )
), которое обычно захватывает только стандартный вывод, но вы можете включить в него stderr. В этом случае вы также >&
должны указать stderr на stdout:
out=$(app 2>&1)
Другой распространенный пример - пейджер или grep
аналогичная утилита, поскольку канал |
обычно работает только на stdout, перед перенаправлением канала stderr перенаправляется на stdout:
app 2>&1 | grep hello
Как узнать, что из 2>&1
или 1>&2
правильно? Уже настроил дескриптор файла идет справа >&
, а файл дескриптора вы хотите редирект идет налево. ( 2>&1
означает «указать дескриптор файла № 2 на дескриптор файла № 1».)
Некоторые оболочки имеют ярлыки для общего перенаправления; Вот примеры из Bash:
1>
можно сократить до всего >
1>foo 2>&1
к >&foo
или&>foo
2>&1 | program
в |& program
app 1>/dev/null 2>&1
будет означать, что 2> & 1 будет указывать на файл, на который 1 уже перенаправлял. Я так понимаю, я мог бы так же легко сделатьapp > /dev/null &>
?the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left
. Что вы подразумеваете под уже настроенным файловым дескриптором? Что это означает право?Одна ситуация, когда вам это нужно, это когда вы хотите отобразить
strace
вывод в пейджере.strace
выводит свой вывод в стандартную ошибку, и каналы обычно соединяют стандартный вывод со стандартным вводом, поэтому вы должны использовать перенаправление:источник
pipes generally connect standard output to standard input
?|
) берет стандартный вывод первой команды и подключает его к стандартному вводу второй команды.Иногда вы хотите перенаправить оба
stdout
(1
) иstderr
(2
) в одно и то же место (/dev/null
например). Одним из способов достижения этого будет:Но большинство людей сокращают, перенаправив
stderr
наstdout
с2>&1
:Еще более короткая версия:
источник
2: Это для случаев, когда у вас будут выходные данные как из стандартной ошибки, так и из стандартной ошибки, и вы хотите, чтобы они были объединены в одну строку.
1: когда вы хотите манипулировать выводом как стандартной ошибки, так и стандартной ошибки.
источник
>2
отправляется в / dev / null. Или я совершенно не понял?Я использую это, чтобы начать отдельную работу:
тогда я могу выйти из системы, и некоторые программы все еще будут работать. Функциональность обеспечивается GNU Screen, tmux и некоторыми другими программами, но здесь это достигается без каких-либо внешних зависимостей.
источник
nohup
илиdisown
в таких случаях.Представьте, что есть каталог
try
с этими тремя файлами:file file1 and file2.
Теперь запустите эту команду:
Первые три файла открываются, но
cat
выдает ошибку при открытии четвертого, так как он не существует.Теперь запустите:
Вы не увидите никакого вывода на экран: Во - первых ,
1>outfile
будет перенаправить вывод команды в ,outfile
а затем он будет перенаправлять (2>&1
) ошибка выброшен при попытке открытьfile3
вoutfile
.1>&2
работает аналогично и перенаправляет поток ошибок на стандартный вывод.Надеюсь это поможет!
источник
Используйте
tty
команду в каждом терминале, чтобы идентифицировать их:Предполагая, что эти TTY, чтобы перенаправить стандартный вывод первого на второй, запустите это в первом терминале:
Чтобы восстановить стандартный вывод поведения pts / 0:
Смотрите это видео для демонстрации.
источник
Случай перенаправления stderr в stdout уже был рассмотрен здесь (например, используйте его для фильтрации (grep) сообщений об ошибках).
Другой случай - перенаправление stdout в stderr. Обычный вариант использования (по крайней мере, для меня) - отправлять предупреждения / сообщения об ошибках, напечатанные с помощью «echo» (в моих скриптах) в stderr (чтобы они могли легче привлечь внимание пользователя).
Например,
источник