Что означает «2> & 1» в оболочке? - PullRequest
2010 голосов
/ 04 мая 2009

В оболочке Unix, если я хочу объединить stderr и stdout в поток stdout для дальнейшей манипуляции, я могу добавить следующее в конец моей команды:

2>&1

Итак, если я хочу использовать head на выходе из g++, я могу сделать что-то вроде этого:

g++ lots_of_errors 2>&1 | head

поэтому я вижу только первые несколько ошибок.

У меня всегда возникают проблемы с запоминанием этого, и мне постоянно приходится искать его, и это главным образом потому, что я не полностью понимаю синтаксис этого конкретного трюка.

Может кто-нибудь разбить это и объяснить символ за символом, что означает 2>&1?

Ответы [ 15 ]

6 голосов
/ 01 сентября 2016

При условии, что /foo не существует в вашей системе, а /tmp существует ...

$ ls -l /tmp /foo

напечатает содержимое /tmp и напечатает сообщение об ошибке для /foo

$ ls -l /tmp /foo > /dev/null

отправит содержимое /tmp на /dev/null и выведет сообщение об ошибке для /foo

$ ls -l /tmp /foo 1> /dev/null

будет делать то же самое (обратите внимание на 1 )

$ ls -l /tmp /foo 2> /dev/null

напечатает содержимое /tmp и отправит сообщение об ошибке на /dev/null

$ ls -l /tmp /foo 1> /dev/null 2> /dev/null

отправит как листинг, так и сообщение об ошибке на /dev/null

$ ls -l /tmp /foo > /dev/null 2> &1

это стенография

6 голосов
/ 01 июля 2012

Люди, всегда помните paxdiablo подсказка о текущем местоположении цели перенаправления ... Это важно важно.

Моя личная мнемоника для оператора 2>&1 такова:

  • Думайте о & как о значении 'and' или 'add' (символ ампер - и , не так ли?)
  • То есть: 'перенаправить 2 (stderr) туда, где * / 1026 * (стандартный вывод) уже / в данный момент находится и добавить оба потока' .

Та же самая мнемоника работает и для других часто используемых перенаправлений, 1>&2:

  • Подумайте о &, что означает and или add ... (вы понимаете, что такое амперсанд, да?)
  • Таким образом, оно становится: 'перенаправить 1 (стандартный вывод) туда, где 2 (стандартный вывод) уже / в настоящее время и добавить оба потока' .

И всегда помните: вы должны читать цепочки перенаправлений «с конца», справа налево ( не слева направо).

5 голосов
/ 11 октября 2013

Это похоже на передачу ошибки на стандартный вывод или в терминал.

То есть cmd не является командой:

$cmd 2>filename
cat filename

command not found

Ошибка отправляется в файл следующим образом:

2>&1

На терминал отправляется стандартная ошибка.

4 голосов
/ 06 июня 2015

Перенаправляющий ввод

Перенаправление ввода вызывает файл, имя которого результат раскрытия слова, которое нужно открыть для чтения в файле дескриптор n или стандартный ввод (дескриптор файла 0), если n не указано.

Общий формат для перенаправления ввода:

[n]<word

Перенаправление вывода

Перенаправление вывода вызывает файл, чей имя происходит от расширения слова, которое будет открыто для записи на дескриптор файла n или стандартный вывод (дескриптор файла 1), если n не указано Если файл не существует, он создается; если оно существует, усекается до нулевого размера.

Общий формат перенаправления вывода:

[n]>word

Перемещение дескрипторов файлов

Оператор перенаправления,

[n]<&digit-

перемещает цифру дескриптора файла в дескриптор файла n или стандартный ввод (дескриптор файла 0), если n не указано. цифра закрывается после дублирования на n.

Аналогично, оператор перенаправления

[n]>&digit-

перемещает цифру дескриптора файла в дескриптор файла n или стандартный вывод (дескриптор файла 1), если n не указано.

Ref:

man bash

Введите /^REDIRECT, чтобы перейти к разделу redirection, и узнайте больше ...

Онлайн-версия находится здесь: 3,6 Перенаправления

PS:

Много времени, man был мощным инструментом для изучения Linux.

1 голос
/ 25 июля 2016

0 для ввода, 1 для стандартного вывода и 2 для стандартного ввода.

Один совет : somecmd >1.txt 2>&1 правильно, а somecmd 2>&1 >1.txt полностью неправильно без эффекта!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...