Я знаю, що >знак використовується для перенаправлення виводу в командному рядку, але у мене виникають проблеми з пошуком чогось, що пояснює використання 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 > logfile2> & 1