В оболочки Unix, если я хочу совместить стандартный вывод
и стандартный вывод
на стандартный вывод
поток для дальнейших манипуляций, я могу добавить следующее На конце моей команде:
2>&1
Поэтому, если я хочу использовать голова
на выходе из Г++
, я могу сделать что-то вроде этого:
g++ lots_of_errors 2>&1 | head
так что я могу видеть только первые несколько ошибок.
Я всегда с трудом вспоминаю это, и мне постоянно приходится идти искать его, и это в основном потому, что я Дон'т полностью понять синтаксис этого конкретного трюка.
Может кто-то их разнять и объяснить посимвольно, что 2>&1
означает?
Файловый дескриптор 1-это стандартный выход (stdout
).<БР>
Файл с дескриптором 2 Стандартная ошибка (устройство
).
Вот один способ запомнить это построить (хотя это не совсем точно): во-первых, 2>1
может выглядеть как хороший способ, чтобы перенаправить поток stderrна
стандартный вывод. Однако, это будет на самом деле интерпретируется как "перенаправить поток stderr в файл с именем
1то".
&указывает, что далее следует дескриптора файла, а не имени. Поэтому конструкция выглядит следующим образом:
2>&1`.
echo test > afile.txt
перенаправляет стандартный вывод для afile.txt`. Это тоже самое что делать
echo test 1> afile.txt
Чтобы перенаправить stderr, вы:
echo test 2> afile.txt
>&
это синтаксис, чтобы перенаправить поток на другой дескриптор файла - 0-это стандартный ввод, 1-это stdout и 2-это поток stderr.
Вы можете перенаправить стандартный вывод в stderr, выполнив:
echo test 1>&2 # or echo test >&2
Или наоборот:
echo test 2>&1
Так, короче... 2>
перенаправление stderr в файл (не указано), добавляя &ампер;1
перенаправляет поток stderr в stdout.
в
Некоторые особенности синтаксиса это может иметь важное поведение. Есть небольшие образцы о переадресации стандартный вывод
, стандартный вывод
, и аргументы заказ.
Символ в >
значит переадресация.
имею в виду - в >
отправить целиком заполненный файл, переписывая цели, если существует (см. noclobber
характеристика баш на #3 более поздние версии).
>>
имею в виду отправка в дополнение к бы присоеденить к цели, если существуют.В любом случае, файл будет создан, если они не существуют.
Для проверки этого, мы должны простой команды, который будет отправлять что-то на обоих выходах:
$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
(Ожидая, что вы Дон'т иметь директорию /ТНТ
, конечно ;). Ну, у нас есть все!!
Итак, давайте's см:
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1
$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory
Последний командной строки отвалов стандартный вывод на консоль, и это, кажется, не быть ожидаемое поведение... но...
Если вы хотите сделать некоторые после фильтрации об один выход, другой или оба:
$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'
$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
Обратите внимание, что последнее командной строки в этом пункте, точно так же, как и в предыдущем пункте, где я писал не ожидаемое поведение (таким образом, это может даже быть ожидаемое поведение).
Ну, есть маленькие хитрости, о переадресации, за делать разные операции на оба выхода:
$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2 2>&1 | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan 7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory
Примечание: &9
дескриптор может произойти спонтанно из-за ) 9>&2
.
Добавление: нота! С новой версией [метки:Баш] (>4.0
) есть новая функция, и более сексуальный синтаксис для ведения такого рода вещи:
$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory
И, наконец, для такой каскадные форматирование вывода:
$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
1 O: drwxrwxrwt 118 root root 196608 Jan 7 12:29 /tmp
2 E: ls: cannot access /tnt: No such file or directory
Добавление: нота! Же новый синтаксис, в обе стороны:
$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
1 O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
2 E: ls: cannot access /tnt: No such file or directory
Где стандартный вывод
пройти через определенный фильтр, стандартный вывод
в другой и, наконец, оба выхода объединены идти через третью команду фильтр.
noclobber
и в > синтаксис|
</а>Что's о перезапись:
В то время как взаимозачета noclobber
поручить баш на **** не перезаписывать существующий файл, то в >|
синтаксис позволю тебе пройти через это ограничение:
$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:15 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:19 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:21 CET 2013
Файл перезаписывается каждый раз, ну а теперь:
$ set -o noclobber
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
Пройти с >|
:
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:18:58 CET 2013
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:19:01 CET 2013
Отключение этого параметра и/или вопросительно, если уже установлен.
$ set -o | grep noclobber
noclobber on
$ set +o noclobber
$ set -o | grep noclobber
noclobber off
$ date > $testfile ; cat $testfile
Mon Jan 7 13:24:27 CET 2013
$ rm $testfile
Для перенаправления и выход из данной команды, мы видим, что могли бы быть правильный синтаксис:
$ ls -ld /tmp /tnt >/dev/null 2>&1
для этого специальные случае, существует сокращенный синтаксис: &>
... или >&
$ ls -ld /tmp /tnt &>/dev/null
$ ls -ld /tmp /tnt >&/dev/null
Примечание: если 2>&1
существует, 1>&2
- это правильный синтаксис тоже:
$ ls -ld /tmp /tnt 2>/dev/null 1>&2
$ ls -ld /tmp /tnt 2>&1 1>&2 | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
$ ls -ld /tmp /tnt 1>&2 2>&1 | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
Вы можете прочитать документацию на наезд:
man -Len -Pless\ +/^REDIRECTION bash
в [тег:Баш] консоли ;-)
Я нашла замечательное сообщение о переадресации: Все о перенаправлений
Перенаправить стандартный вывод и стандартный поток ошибок в файл
команда $ &>файл
Это один-лайнер использует &>
оператора перенаправить потоки вывода stdout и stderr - из команды в файл. Это Баш'ы ярлык для быстрого перенаправления оба потока в том же направлении.
Вот как таблица дескрипторов файла выглядит как после Баш перенацелил обоих потоков:
Как видите, оба stdout и stderr теперь выберите файл
. Так что все, что написано в stdout и stderr записывается в файл.
Есть несколько способов, чтобы перенаправить потоки в том же направлении. Вы можете перенаправлять каждого потока один за другим:
и GT; $ команды >файл 2>&1
Это гораздо более распространенный способ, чтобы перенаправить потоки в файл. Первый стандартный вывод перенаправляется в файл, а затем поток stderr дублируется таким же, как и стандартный вывод. Так как потоки в конечном итоге указывая на "файл".
Когда Баш видит несколько перенаправлений, он обрабатывает их слева направо. Позвольте's идти по шагам и посмотреть, как это происходит. Перед выполнением любой команды, Баш's файл в таблице дескрипторов выглядит так:
Теперь Баш обрабатывает первое перенаправление >файл. Мы'вэ видел это раньше, и это делает точку стандартный вывод в файл:
Следующий Баш видит второй перенаправление 2>&1. Мы не'т видели это перенаправление раньше. Это один дублирует дескриптор файла 2, чтобы быть копию дескриптора файла 1, и мы получаем:
Оба потока были перенаправлены в файл.
Однако будьте осторожны здесь! Пишу
команда >файл 2>&1
это не то же самое что писать:
&амп команду $ 2;1 >файл
Порядок перенаправления дела в Баш! Эта команда перенаправляет только стандартный вывод в файл. В stderr будут еще печатать в терминале. Чтобы понять, почему это происходит, давайте's идти через шаги снова. Поэтому перед выполнением команды, таблица дескрипторов файлов выглядит так:
Теперь Баш обрабатывает редиректы слева направо. Сначала он видит 2>&1 так он дублирует поток stderr в stdout. Таблица дескрипторов файлов становится:
Теперь Баш видит второго перенаправления, в `>файл, и он перенаправляет стандартный вывод в файл:
Вы видите, что здесь происходит? Поток stdout теперь указывает на файл, но устройство по-прежнему указывает на терминал! Все, что попадает в stderr еще будет напечатано на экране! Так что будьте очень, очень осторожны с целью перенаправления!
Также обратите внимание, что в bash, написание
команда $ &>файл
точно так же, как:
и GT; $ команды >&амп&; файл
Цифры указывают на файловых дескрипторов (ФД).
стандартный ввод
стандартный вывод
устройство
2>&1
перенаправляет ФД 2 в 1.
Это работает для любого количества файловых дескрипторов, если программа их использует.
Вы можете посмотреть в каталоге/usr/включать/запустите.ч если вы забыли их:
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
Что сказал, я написал функции, которые используют нестандартные файловые дескрипторы для нестандартной вырубкой, так что вы Дон't видеть его, если вы не перенаправить его в файл или что-то.
Что построить отправляет стандартного потока ошибок (устройство
) в ток расположение стандартный выход (stdout
) - это валютные проблемы, видимо, были забыты и другие ответы.
Вы можете перенаправить любой вывод ручки в другую, используя этот метод, но он'ы наиболее часто используется для канала стандартный вывод
и `поток stderr потоков в единый поток для обработки.
Некоторые примеры являются следующими:
# Look for ERROR string in both stdout and stderr.
foo 2>&1 | grep ERROR
# Run the less pager without stderr screwing up the output.
foo 2>&1 | less
# Send stdout/err to file (with append) and terminal.
foo 2>&1 |tee /dev/tty >>outfile
# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2
Обратите внимание, что последняя будет не прямой стандартный вывод
до outfile2
- он переадресует ее к тому, что стандартный вывод
, когда аргумент встретились (outfile1
) и тогда перенаправляет стандартный вывод
до outfile2
.
Это позволяет довольно изощренное надувательство.
2>&1
- это оболочка POSIX построить. Вот разбивка, маркер, маркер:
2
: " поСтандартная ошибка" в выходной файл дескриптора.
>&
: дублирование вывода дескриптор файла оператор (вариант перенаправление вывода оператор в >
). Учитывая [х]>&[м]
, файловый дескриптор обозначается х
К быть копии выходного файла, дескриптор г
.
1 в
"вывод" в выходной файл дескриптора.
Выражение 2>&1
копирует файл дескриптора 1
в месте 2
, так что любые данные, записанные в 2
("по стандартной ошибке") в рамках исполнения условий идет в тот же файл изначально описал 1
(на"стандартный выход на").
Дальнейшее объяснение:
И все же ***дескриптор файла; в-процесс уникальный, неотрицательное целое число, используемое для идентификации открыть файл для открыть файл.&и"
Стандартный вывод/ошибка: см. следующее примечание в переадресация раздел оболочки документация:
открыть файлы представлены с помощью десятичных чисел, начиная с нуля. Наибольшее возможное значение определяется реализацией; однако, все реализации должны поддерживать, по крайней мере, от 0 до 9 включительно, для использования приложения. Эти цифры назвали "дескрипторы файла и". Значения 0, 1 и 2 имеют особое значение и обычных использует и подразумеваются определенные операции перенаправления; они упоминаются как стандартный ввод, стандартный вывод и стандартная ошибка, соответственно. Программы обычно занимают свои входные данные из стандартного ввода и выводить на стандартный вывод. Сообщения об ошибках обычно записываются в стандартный поток ошибок. Операторы перенаправления может предшествовать одна или более цифр (без вмешательства в <пробел> В символов) определить количество дескрипторов файлов.
2 Стандартная ошибка консоли.
1-стандартный вывод на консоль.
Это стандартный Unix и Windows также соответствует стандарту POSIX.
Е. Г. при запуске
perl test.pl 2>&1
Стандартная ошибка перенаправляется на стандартный вывод, так что вы можете видеть оба выхода вместе:
perl test.pl > debug.log 2>&1
После выполнения, вы можете просмотреть все результаты, в том числе ошибок в отладочной.журнал.
perl test.pl 1>out.log 2>err.log
Затем стандартный вывод идет на выход.журнала, и стандартная ошибка к заблуждению.журнал.
Я предлагаю вам попробовать разобраться в этих.
Чтобы ответить на ваш вопрос: он принимает какие-либо вывода ошибок (обычно направляются в stderr) и записывает его в стандартный вывод (stdout).
Это полезно, например 'подробнее' когда вам нужно подкачки для всех выход. Некоторые программы, такие как печать информации об использовании в поток stderr.
Чтобы помочь вам запомнить
на "2>&1" и просто все направляются в stderr, а не в стандартный вывод.
Я также рекомендую прочитать это сообщение о перенаправлении ошибка, где эта тема рассматривается во всех подробностях.
От программиста's точки зрения, это означает именно это:
dup2(1, 2);
Смотрите страницы.
Понимание того, что 2>&1
- это копия также объясняет, почему ...
command >file 2>&1
... не совпадает ...
command 2>&1 >file
Первый вышлем оба потока в файл, в то время как второй будет отправлять ошибки в стандартный вывод
, и обычный выход на "файл".
При условии, что в/Foo
не существует на вашей системе и /tmp
, которая делает...
$ ls -l /tmp /foo
будет напечатать содержимое /tmp
и печатать сообщение об ошибке для /фу
$ ls -l /tmp /foo > /dev/null
вышлем содержимое каталоге /tmp
в в/dev/null и печатать сообщение об ошибке для
/фу`
$ ls -l /tmp /foo 1> /dev/null
буду делать точно так же (обратите внимание на 1)
$ ls -l /tmp /foo 2> /dev/null
будет напечатать содержимое /tmp
и отправить сообщение об ошибке /dev/нуль
$ ls -l /tmp /foo 1> /dev/null 2> /dev/null
вышлем как листинг, а также сообщение об ошибке /dev/нуль
$ ls -l /tmp /foo > /dev/null 2> &1
стенография
Люди, всегда помните paxdiablo'с намеком о текущий расположение целевого перенаправления... это составляет важно.
Мое личное мнемоническое за 2>&1
оператора такова:
&
как значение 'и' или'добавить'
(символ ампер-и, это'т его?)2
(поток stderr), где 1
(поток stdout) уже/в настоящее время и добавить как ручейки'.То же мнемоническое правило работает для других часто используемых перенаправление тоже 1>&2
:
&
смысл и
или добавить
... (ну вы поняли о амперсанд, да?)1
(поток stdout), где 2
(поток stderr) уже/в настоящее время и добавить как ручейки'.И всегда помните: вы должны прочитать цепочки перенаправлений 'С конца', справа налево (не слева направо).
перенаправление ввода
перенаправление ввода вызывает файл, имя которого результаты от расширения слова должен быть открыт для чтения на файл дескриптором N, или стандартного ввода (дескриптор файла 0), если N не указано.
общий формат для перенаправления ввода:
[Н]<слово
перенаправление вывода
перенаправление вывода вызывает файл, наименование результаты от расширения слова должен быть открыт для записи на В файл с дескриптором N, или стандартный вывод (дескриптор файла 1) Если N не указан. Если файл не существует, он будет создан; если он не существует, он усекается до нулевого размера.
общий формат для перенаправления вывода:
[Н] И gt;слово
перенос файловых дескрипторов
оператор перенаправления,
[Н]<&цифра-
перемещение дескриптор файла цифры в файл с дескриптором N, или стандартного ввода (дескриптор файла 0), если N не указано. цифра закрыт после дублируются до n.
аналогично, оператор перенаправления
[Н]>&цифра-
перемещение дескриптор файла цифры в файл с дескриптором N, или стандартный поток вывода (дескриптор файла 1) Если N не указано.
man bash
Типа /^редирект найдите
перенаправление` разделе, и узнать больше...
Онлайн-версия здесь: 3.6 перенаправлений
Много времени, "человек" стало мощным инструментом в изучении Linux.
Это просто как проходящий ошибки в stdout или терминал.
То есть, " ЦМД " не является командой:
$cmd 2>filename
cat filename
command not found
Ошибка отправляется в файл, такой:
2>&1
Стандартная ошибка отправляются на терминал.