Я знаю, что знак > используется для перенаправления вывода в командной строке, но у меня возникают проблемы с поиском чего-то, что объясняет использование 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