Я знаю, що >
знак використовується для перенаправлення виводу в командному рядку, але у мене виникають проблеми з пошуком чогось, що пояснює використання 2>&1
в командному рядку. Наприклад:
curl http://www.google.com > /dev/null 2>&1 &
Я знаю, що >
знак використовується для перенаправлення виводу в командному рядку, але у мене виникають проблеми з пошуком чогось, що пояснює використання 2>&1
в командному рядку. Наприклад:
curl http://www.google.com > /dev/null 2>&1 &
Відповіді:
1
Позначає стандартний висновок (стандартний висновок). 2
Стандартна помилка означає (STDERR).
Так 2>&1
говорить, щоб надіслати стандартну помилку туди, куди колись перенаправляється стандартний вихід. Що з моменту його надсилання /dev/null
схоже на ігнорування взагалі будь-яких результатів.
0
(stdin), 1
(stdout) і 2
(stderr) - це фактично дескриптори файлів, оболонці потрібен ampersand, поставлений перед ними для перенаправлення. Він дублює дескриптор файлу в цьому випадку, ефективно зливаючи два потоки інформації разом.
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