Помогите мне понять это простое перенаправление ввода-вывода в bash из руководства АБС - PullRequest
7 голосов
/ 22 ноября 2010
exec 3>&1                           # Save current "value" of stdout.  
ls -l 2>&1 >&3 3>&- | grep bad 3>&- # Close fd 3 for 'grep' (but not 'ls').  
#              ^^^^   ^^^^
exec 3>&-                           # Now close it for the remainder of the script.  

Я получаю третью строку, где fd 3 закрывается.

Сомнения: 1-я строка перенаправляет fd 3 на стандартный вывод, глобально ... верно?
Вопросы: Что происходит во 2-й строке? Пожалуйста, предоставьте подробное объяснение, если это возможно.

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Перенаправления обрабатываются внешней командой на внутреннюю команду и внутри команды слева направо. Следовательно, ls -l 2>&1 >&3 3>&- изначально получает стандартный поток в канал. Затем stderr перенаправляется на канал, stdout становится исходным stdout (unpiped), а дополнительный fd закрывается. Таким образом, обычный вывод ls -l остается неизменным, строки вывода ошибок, содержащие «bad», отправляются на стандартный вывод, а остальная часть вывода ошибок отбрасывается.

2 голосов
/ 22 ноября 2010

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

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