Чому перенаправлення STDERR на / dev / null робиться саме так?


29

Це для мене немає сенсу.

wibble > /dev/null 2>&1

Я думаю, було б більше сенсу, якби це було щось подібне:

wibble 2>&1 > /dev/null

Іншими словами

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null

Яке мислення стоїть за порядком перенаправлення команд xxx > /dev/null 2>1?


6
Ви також можете вважати це пояснення корисним.
rozcietrzewiacz

Дякую @rozcietzewiacz, що насправді пояснює моє запитання
whoami

1
У середині цієї сторінки у Вікі Грега є чудовий уривок : "Якщо ви все ще плутаєтесь на цьому етапі, це, мабуть, тому, що ви почали з помилкового уявлення про те, як працюють FD, і ви не змогли залишити це неправильне уявлення. поки що. Не хвилюйтеся - це надзвичайно поширене оману, і ви не самотні. ... Багато хто думає, що 2>&1якимось чином "об'єднує" або "пов'язує" або "одружується" дві ФД, так що будь-яка [наступна] зміна в одній з них стає зміною на іншу. Це не так ".
G-Man каже" Відновити Моніку "

Відповіді:


41

Переадресації обробляються зліва направо. Якщо ти зробиш

2>&1 1> /dev/null

Перше переадресація stderrвказує на потік, який stdoutвказує на той час (що по суті є вашим tty). Це не stderrмає псевдоніму stdout.

Потім stdoutпереспрямовується на бітове відро. stdoutРедирект не впливає на попередній stderrредирект. stderrяк і раніше посилається на ваш tty.

Так:

ls file_that_doesnt_exist 2>&1 1> /dev/null

буде друкувати лише повідомлення про помилку на вашому терміналі.

Сторінка bashдокументації про переадресацію чітко зазначає це:

Зауважимо, що порядок переадресацій є вагомим. Наприклад, команда

          ls > dirlist 2>&1

направляє як стандартний вихід, так і стандартну помилку до файлу dirlist, виконуючи команду

          ls 2>&1 > dirlist

направляє лише стандартний вихід у файл dirlist, оскільки стандартна помилка дублюється зі стандартного виводу до того, як стандартний вихід буде перенаправлений на dirlist .


3
Yay вирішує мою загадку. Я все ще вважаю логічно її заплутаною. але я знайшов іншу частину на тій же сторінці, яка цікава &>/dev/null, семантично рівнозначна/dev/null 2>&1
whoami

1
Слід підкреслити, що сторінка, про яку ви говорите, є частиною Довідкового посібника Баша . Це, очевидно, описує баш . Є інші оболонки в світі, відрізняється від Баш, і &>та >&(якщо не використовується в контексті 2>&1або >&2і т.д.) є Баш-ізмів і не є стандартом . Вони не повинні використовуватися в скриптах оболонок, які ви хочете переносити.
G-Man каже: "Відновіть Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.