Почему перенаправление + pipe (2> & 1 |) объединяет оба потока вместо перемещения stderr в stdout? - PullRequest
4 голосов
/ 25 июня 2011

Я прочитал, что перенаправления обрабатываются слева направо.Таким образом, в этом примере

 command 2>&1 | less

Можно подумать, что fd 2 сначала направляется на fd 1, а затем fd 1 отправляется в pipe.Таким образом, fd 1 и 2 указывают на отдельные места.

Но на самом деле здесь fd 1 и 2 указывают на канал, потому что по какой-то причине fd 1 сначала отправляется в pipe, а затем fd 2 отправляется в fd 1.Почему перенаправления обрабатываются справа налево в этом случае?

Ответы [ 3 ]

3 голосов
/ 25 июня 2011

Причина в том, что каналы не совпадают с перенаправлениями. Перенаправление влияет на одну команду, а канал соединяет две команды.

3 голосов
/ 27 июня 2011

fd 2 направлено туда, куда указывает fd 1 (т.е. стандартный вывод). В

command 2>&1 | less

stdout уже указывает на канал, прежде чем перенаправления вступят в силу!

Более подробное объяснение см .:

http://www.linuxtutorialblog.com/post/tutorial-the-best-tips-tricks-for-bash

# ...
# Well, here's a thing you should remember: bash reads command statements from 
# the left to the right, but, before that, determines if there are multiple command 
# statements and in which way they are separated. Therefore, bash already read 
# and applied the "|" pipe symbol and stdout is already pointing to the pipe.
# ...
3 голосов
/ 25 июня 2011

Канал не является перенаправлением, так что на самом деле перенаправления (из которых только один в вашем примере) обрабатываются так, как вы думаете. Труба - это отдельная вещь в конце.

...