2013-06-26 4 views
1

Каковы различия между этими командами:В чем разница между различными типами перенаправления ввода/вывода?

  1. command 2>&1 > log
  2. command > log 2>&1
  3. command >& log
  4. command > log 1>&2

Сначала один вывод ошибки в консоль и, выход в журнал , Почему не оба не идут в журнал?

Второй не производит никакого вывода, выход и ошибка находятся в журнале. Какая разница, чтобы положить 2>&1 в конце?

Третий вариант аналогичен предыдущему. Для чего это ярлык?

Четвертый переносит все на консоль и ничего не записывает в журнал?

пример команды: ls -ld /tmp /xxx

+0

IMHO корпус № 2 и №4 идентичен, не так ли? – TrueY

+0

@TrueY № # 2 позволяет 2 точка до 1, # 4 позволяет 1 балл до 2. – glglgl

+0

@glglgl: после модификации Q. :) – TrueY

ответ

4

Это очень хорошо объяснено в twoarticles. По существу, вы должны прочитать перенаправления слева направо, как копий выходного объекта. Так

command 2>&1 > log 
  1. Устанавливает цель FD 2 (стандартная ошибка) к цели FD 1 (стандартный вывод), который, как правило, терминал.
  2. Устанавливает цель FD 1 в файл log.

Они не являются транзитивными, поэтому стандартная ошибка действительно указывает на терминал при запуске команды.


command > log 2>&1 
  1. Устанавливает цель FD 1 в файл log.
  2. Устанавливает цель FD 2 (стандартная ошибка) для цели FD 1 (стандартный вывод), которая теперь является файлом log.

Это означает, что стандартный вывод и стандартная ошибка регистрируются в том же файле.


command >& log 

Перенаправление как стандартная ошибка и стандартный вывод в файл log. Это синтаксический сахар Bash для предыдущей команды.


command > log 1>&2 
  1. Устанавливает цель FD 1 в файл log.
  2. Устанавливает цель FD 1 для цели FD 2 (стандартная ошибка), которая обычно является терминалом. Это отменяет предыдущее перенаправление.
2

Порядок Перенаправление имеет важное значение в :

  1. command 2>&1 > log перенаправляет stderr к stdoutstdout, а затем в лог-файл. Таким образом, результат stderr переходит на экран (если не перенаправлен на какой-то более высокий уровень), а stdout идет в файл.
  2. command > log 2>&1 перенаправляет stdout в файл, а stderr перенаправляется на дескриптор файла 1 который является файлом.
  3. command >&log - это ярлык для предыдущего случая, а именно перенаправление stderr и stdout к файлу.
  4. Это то же самое, как случай # 2
  5. command > log 1>&2 перенаправляет stderr (дескриптор файла 1) в файл, то он перенаправляет его на stderr. В результате stdout пойдет на stderr. Но появляется нулевой байт log. Это можно записать как command >log >&2.