Я знаю, что знак >
используется для перенаправления вывода в командной строке, но у меня возникают проблемы с поиском чего-то, что объясняет использование 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
, похоже на игнорирование любого вывода вообще.
Получите 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
в терминале.
2
относится к STDERR. 2>&1
отправит STDERR в то же место, что и 1
(STDOUT).
Я понимаю, как следует:
Если вы хотите только прочитать информацию «Вывод и ошибка» команды на экране, просто напишите: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