Що робить "2> & 1" у командному рядку?


59

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

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

Відповіді:


78

1Позначає стандартний висновок (стандартний висновок). 2Стандартна помилка означає (STDERR).

Так 2>&1говорить, щоб надіслати стандартну помилку туди, куди колись перенаправляється стандартний вихід. Що з моменту його надсилання /dev/nullсхоже на ігнорування взагалі будь-яких результатів.


2
Чи є причина, що амперсанд з'являється перед 1, а не перед 2? Я думав, що & є зарезервованим символом для виконання завдання у фоновому режимі, але я думаю, що це лише в тому випадку, якщо в кінці команди ampersand з'являється як довгий символ ...?
Метт Хаггінс

8
Оскільки 0(stdin), 1(stdout) і 2(stderr) - це фактично дескриптори файлів, оболонці потрібен ampersand, поставлений перед ними для перенаправлення. Він дублює дескриптор файлу в цьому випадку, ефективно зливаючи два потоки інформації разом.
Chealion

12
Подумайте про це так: якби у вас просто був "1" без амперсанда, оболонка створила б файл під назвою "1" і перенаправляла б на нього вивід stroder.
CarlF

1
Гаразд, чи це єдине було б тоді дійсним? curl http://www.google.com 2>/dev/nullЯк командний рядок знає, що "2" тут має означати stderr і насправді не є другим параметром, який я передаю команді curl?
Метт Х'юггінс

1
@Matt Huggins: Так. Це дозволило б надіслати весь висновок stderrпрямо на /dev/nullмісце. Ви можете побачити це на практиці, намагаючись curl, curl 1>/dev/nullі curl 2>/dev/nullпросто , щоб побачити зміна вихідного сигналу. Знову амперсанда потрібна лише для дескриптора файлів, на який перенаправляється.
Chealion

23

тл; д-р

Виберіть 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 / null

/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в терміналі.

Список літератури


1
Це одна з найкращих відповідей на всьому веб-сайті з точки зору макета, молодець!
ОмарОтман

Одне, чого я не отримую, - це чому б ви хотіли все надіслати /dev/null? Ви не хочете, щоб результати curlхоча б десь були корисними?
скубе

@skube Право. У цьому випадку мені незрозуміло, чому користувач хоче відкинути і stdout, і stderr. ОП, напевно, просто хотів зрозуміти, що означає синтаксис.
Хорхе Букарань

5

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 > logfile2> & 1

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.