2017-02-04 7 views
2

Эта страница (http://tldp.org/LDP/abs/html/io-redirection.html) объясняет (ближе к концу), почему эта команда:Почему ошибка этой команды не заканчивается в данном файле? Ls -YZ 2> & 1 >> command.log

ls -yz 2>&1 >> command.log

не выводит ошибки в файл command.log.

Однако мне все еще не ясно. Если 2>&1 перенаправляет stderr на stdout, то не >> просто возьмите результаты stdout и добавьте их в command.log?

ответ

1

С перепродажей, порядок вопросов. Сделайте это наоборот.

ls -yz >>command.log 2>&1 

Работа по перенаправлению осуществляется путем «копирования дескрипторов файлов». Если вы попытаетесь перенаправить stderr в первую очередь (перед перенаправлением stdout), тогда stderr будет отправлен туда, где stdout - , в настоящее время going, что является терминалом. Когда вы позже перенаправляете stdout к вашему файлу, это не возвращается снова для перенаправления stderr.

+2

Я был бы очень благодарен за объяснение нисходящей линии, как будто мой ответ неверен, я кое-что узнаю здесь. – Fred

+0

Я думаю, что OP знает, что порядок имеет значение, вопрос «почему» имеет значение. Обратите внимание, что два порядка показаны бок о бок на странице, связанной OP, так что это довольно ясно. – janos

1

По умолчанию оба устройства stdout & stderr направляются на терминал. В команде в вашем вопросе сообщает оболочке отправить stderr на то же место, что и stdout. Это похоже на no-op, потому что stdout в этот момент все еще идет к терминалу, в том же месте, что и stderr. После этого >> command.log получает синтаксический анализ и заканчивает отправку только stdout в этот файл. Порядок имеет значение, как справедливо говорит @Fred.

Более короткий способ сделать это:

ls -yz &>> command.log 
3

Прежде всего, отметим, что >log это стенография для 1>log. Синтаксис N>M переводит на переназначения указателя. Назовем указатель стандартным выходом fd1 и указателем на стандартную ошибку fd2.То есть:

  • fd1 является указателем на stdout
  • fd2 является указателем на stderr

При выполнении cmd 2>&1 >log, он изменяет указатели так:

  • сделать fd2 укажите, на что fd1 указывает, что составляет stdout
  • сделать fd1 точку в файл
  • => в результате, fd2 указывает на stdout и fd1 указывает на файл

При выполнении cmd >log 2>&1, он изменяет указатели, как это:

  • Марка fd1 указывает на файл
  • Марка fd2 указывает на то, что fd1 указывает, который является файлом
  • => В результате, как fd1 и fd2 указывают на тот же файл

То есть, на основе упорядочения указателей переназначения, результат будет другим. В одном случае оба указателя будут указывать на одно и то же, или они будут указывать на разные вещи.

Вместо использования ls -yz в качестве примера команды cmd, я найти более подходящий пример, чтобы объяснить это ls yes nonexistent, где yes это файл, который существует, и nonexistent это файл, который не делает. В этом примере будет напечатано что-то на stdout и stderr, и, играя с порядком N>M, вы можете более четко видеть, где все закончилось. (С ls -yz есть только stderr, в то время как stdout пуст.)

+1

Очень хорошо объяснено! – codeforester