Я знаю, что >
знак используется для перенаправления вывода в командной строке, но у меня возникают проблемы с поиском чего-то, что объясняет использование 2>&1
в командной строке. Например:
curl http://www.google.com > /dev/null 2>&1 &
Я знаю, что >
знак используется для перенаправления вывода в командной строке, но у меня возникают проблемы с поиском чего-то, что объясняет использование 2>&1
в командной строке. Например:
curl http://www.google.com > /dev/null 2>&1 &
Ответы:
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
.
curl http://www.google.com > /dev/null 2>&1 &
такой же как
curl http://www.google.com > /dev/null 2>/dev/null &
0
, 1
И 2
представляют собой стандартные файловые дескрипторы в POSIX операционных систем. Дескриптор файла - это системная ссылка на (в основном) файл или сокет .
Создание нового файлового дескриптора в C может выглядеть примерно так:
fd = open("data.dat", O_RDONLY)
Большинство системных команд Unix принимают ввод и выводят результат на терминал. curl
получит все, что находится по указанному URL ( google dot com ) и отобразит результат в stdout
.
Как вы сказали, <
и >
используются для перенаправления вывода команды в другое место, например, в файл.
Так , например, в ls > myfiles.txt
, ls
получает содержимое текущего каталога и >
перенаправляет свой вывод myfiles.txt
(если файл не существует , он будет создан, в противном случае перезаписаны, но вы можете использовать >>
вместо >
добавляемого в файл , а). Если вы выполните команду выше, вы заметите, что ничего не отображается на терминале. Это обычно означает успех в системах Unix. Чтобы проверить это, cat myfiles.txt
чтобы отобразить содержимое файла на экране.
Первая часть > /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/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
хотя бы где-нибудь полезного?
Я понимаю, как следует:
Если вы хотите только прочитать информацию «Вывод и ошибка» команды на экране, просто напишите:
curl http://www.google.com
И иногда вы хотите сохранить информацию вывода в файл вместо экрана терминала для последующего просмотра, тогда вы можете написать:
curl http://www.google.com > logfile
Но в этом случае информация StdErr будет опущена, поскольку >
перенаправляется только StdOut logfile
.
Таким образом, если вы заботитесь об информации об ошибке команды, когда она не выполняется, вам нужно объединить StdOut с StdErr с помощью 2>&1
(что означает сворачивание StdErr в StdOut), поэтому можно написать следующую командную строку:
curl http://www.google.com > logfile
2> & 1