58

Я знаю, что знак > используется для перенаправления вывода в командной строке, но у меня возникают проблемы с поиском чего-то, что объясняет использование 2>&1 в командной строке. Например:

curl http://www.google.com > /dev/null 2>&1 &

4 ответа4

76

1 обозначает стандартный вывод (stdout). 2 обозначает стандартную ошибку (stderr).

Итак, 2>&1 говорит, что отправлять стандартную ошибку туда, где когда-либо перенаправляется также стандартный вывод. Что, поскольку оно отправляется в /dev/null , похоже на игнорирование любого вывода вообще.

22

ТЛ; др

Получите 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 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 .

> /dev /null

Но почему некоторые вещи все еще отображаются на терминале? Это не обычный вывод curl , а данные, отправляемые в stderr , используемые здесь для отображения информации о ходе работы и диагностики, а не только об ошибках.

curl http://www.google.com > /dev/null 2>&1 игнорирует выход как curl «ы и информацию о ходе curl сек. В результате ничего не отображается на терминале.

в заключение

& В конце - это то, как вы указываете оболочке запускать команду как задание в фоновом режиме. Это заставляет приглашение немедленно вернуться, пока команда выполняется асинхронно за кулисами. Чтобы увидеть текущие вакансии, введите jobs в вашем терминале. Обратите внимание, что это отличается от процессов, запущенных в вашей системе. Чтобы увидеть их, наберите top в терминале.

Рекомендации

4

2 относится к STDERR. 2>&1 отправит STDERR в то же место, что и 1 (STDOUT).

0

Я понимаю, как следует:

Если вы хотите только прочитать информацию «Вывод и ошибка» команды на экране, просто напишите: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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .