Я знаю, что >
знак используется для перенаправления вывода в командной строке, но у меня возникают проблемы с поиском чего-то, что объясняет использование 2>&1
в командной строке. Например:
curl http://www.google.com > /dev/null 2>&1 &
command-line
shell
redirection
Мэтт Хаггинс
источник
источник
Ответы:
1
Обозначает стандартный вывод (STDOUT).2
Обозначает стандартную ошибку (STDERR).Так
2>&1
говорит отправлять стандартную ошибку туда, куда когда-либо перенаправляется стандартный вывод. Который, поскольку он отправляется,/dev/null
сродни игнорированию любого вывода.источник
0
(stdin),1
(stdout) и2
(stderr) на самом деле являются файловыми дескрипторами, для перенаправления оболочка требует наличия амперсанда и перед ними. В этом случае он дублирует файловый дескриптор, эффективно объединяя два потока информации.curl http://www.google.com 2>/dev/null
Как из командной строки узнать, что «2» здесь означает «stderr», и на самом деле это не второй параметр, который я передаю команде curl?stderr
прямо на место/dev/null
. Вы можете увидеть это на практике, попробовавcurl
,curl 1>/dev/null
иcurl 2>/dev/null
просто увидев изменение результата. Опять же, амперсанд необходим только для перенаправления дескриптора файла.ТЛ; др
Получить
http://www.google.com
в фоновом режиме и отказаться от обоихstdout
иstderr
.такой же как
основы
0
,1
И2
представляют собой стандартные файловые дескрипторы в POSIX операционных систем. Дескриптор файла - это системная ссылка на (в основном) файл или сокет .0 stdin
1 stdout
2 stderr
Создание нового файлового дескриптора в C может выглядеть примерно так:
Большинство системных команд Unix принимают ввод и выводят результат на терминал.
curl
получит все, что находится по указанному URL ( google dot com ) и отобразит результат вstdout
.Перенаправление
Как вы сказали,
<
и>
используются для перенаправления вывода команды в другое место, например, в файл.Так , например, в
ls > myfiles.txt
,ls
получает содержимое текущего каталога и>
перенаправляет свой выводmyfiles.txt
(если файл не существует , он будет создан, в противном случае перезаписаны, но вы можете использовать>>
вместо>
добавляемого в файл , а). Если вы выполните команду выше, вы заметите, что ничего не отображается на терминале. Это обычно означает успех в системах Unix. Чтобы проверить это,cat myfiles.txt
чтобы отобразить содержимое файла на экране.> / dev / null 2> & 1
Первая часть
> /dev/null
перенаправляет выводstdout
, то естьcurl
, на/dev/null
(подробнее об этом впереди) и2>&1
перенаправляетstderr
наstdout
(который был просто перенаправлен,/dev/null
чтобы все было отправлено/dev/null
).В левой части
2>&1
указывается, что будет перенаправлено, а в правой - куда .&
Используются на правой стороне , чтобы отличитьstdout (1)
илиstderr (2)
из файлов с именем1
или2
. Таким образом, в2>1
конечном итоге будет создан новый файл (если он еще не существует) с именем1
и получитсяstderr
результат./ DEV / нуль
/dev/null
это пустой файл, механизм, используемый для отбрасывания всего, что ему написано. Таким образом,curl http://www.google.com > /dev/null
эффективно подавляетcurl
выходной.Но почему некоторые вещи все еще отображаются на терминале? Это не
curl
обычный вывод, а данные, отправляемые вstderr
, используемые здесь для отображения информации о ходе работы и диагностики, а не только ошибок .curl http://www.google.com > /dev/null 2>&1
игнорирует какcurl
вывод, так иcurl
информацию о прогрессе. В результате ничего не отображается на терминале.в заключение
В
&
конце указано, как вы указываете оболочке запускать команду как задание в фоновом режиме . Это заставляет приглашение немедленно вернуться, пока команда выполняется асинхронно за кулисами. Чтобы увидеть текущие вакансии типаjobs
в вашем терминале. Обратите внимание, что это отличается от процессов, запущенных в вашей системе. Чтобы увидеть те,top
в терминале.Рекомендации
источник
/dev/null
? Разве вам не нужны результатыcurl
хотя бы где-нибудь полезного?2
относится к STDERR.2>&1
отправит STDERR в то же место, что и1
(STDOUT).источник
Я понимаю, как следует:
Если вы хотите только прочитать информацию «Вывод и ошибка» команды на экране, просто напишите:
curl http://www.google.com
И иногда вы хотите сохранить информацию вывода в файл вместо экрана терминала для последующего просмотра, тогда вы можете написать:
curl http://www.google.com > logfile
Но в этом случае информация StdErr будет опущена, поскольку
>
перенаправляется только StdOutlogfile
.Таким образом, если вы заботитесь об информации об ошибке команды, когда она не выполняется, вам нужно объединить StdOut с StdErr с помощью
2>&1
(что означает сворачивание StdErr в StdOut), поэтому можно написать следующую командную строку:curl http://www.google.com > logfile
2> & 1источник