Іноді ви хочете перенаправити як stdout, так і stderr в одне і те ж місце. Це коли >&
використовується - це вказує один дескриптор файлу на інший.
Наприклад, якщо ви хочете записати і stdout, і stderr в один і той же файл (будь то /dev/null
або output.txt
), ви можете перенаправити їх окремо, за допомогою
app 1>/dev/null 2>/dev/null
або ви можете перенаправити один дескриптор файлу на файл, а інший дескриптор файлу на перший:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
У першому прикладі 2>&1
вказується дескриптор файлу №2 до місця, де №1 вже вказується. Другий приклад досягає того ж, щойно починається із stderr.
Як інший приклад, є випадки, коли stdout (дескриптор файлу №1) вже вказує на потрібне місце, але ви не можете посилатися на нього по імені (це може бути пов'язано з трубою, сокетом чи іншим). Це часто трапляється при використанні розширення процесів ( ` `
або $( )
операторів), яке, як правило, лише фіксує stdout, але ви можете включити в нього stderr. У цьому випадку ви також використовуєте, >&
щоб вказати stderr на stdout:
out=$(app 2>&1)
Іншим поширеним прикладом є пейджер grep
або подібна утиліта, оскільки труба |
зазвичай працює тільки на stdout, ви перенаправляєте stderr на stdout перед використанням труби:
app 2>&1 | grep hello
Як дізнатися , який з 2>&1
або 1>&2
є правильним? Уже налаштував дескриптор файлу йде справа >&
, а файл дескриптора ви хочете редирект йде наліво. ( 2>&1
означає "дескриптор файлу точки №2 до дескриптора файлу №1".)
У деяких оболонках є ярлики для загальних переадресацій; ось приклади від Bash:
1>
можна скоротити до просто >
1>foo 2>&1
до >&foo
або&>foo
2>&1 | program
до |& program
app 1>/dev/null 2>&1
означатиме, що 2> і 1 вказуватимуть на файл, до якого 1 вже перенаправлено. Я вважаю, що міг би так само легко зробитиapp > /dev/null &>
?