TL; DR: >/dev/null 2>&1 || true
эффективно заставляет команду замолчать, отбрасывая любой (ошибочный или обычный) вывод и результат команды, но не любые ее побочные эффекты. Далее следует объяснение почему.
Программы Linux по умолчанию получают три файловых дескриптора, которые открываются до начала выполнения основного кода программы. Это stdin
(стандартный ввод, дескриптор файла 0), stdout
(стандартный вывод, дескриптор файла 1) и stderr
(стандартная ошибка, дескриптор файла 2). Они обычно привязаны к текущему терминалу, который сегодня фактически означает клавиатуру, экран и экран соответственно (но так было не всегда).
Указывая > /dev/null
в команде (перенаправление обычно может происходить в любом месте команды, но по соглашению оно происходит в конце или очень редко в начале), вы указываете, что стандартный вывод (неявный 1
, но может быть указан с помощью 1>
вместо just >
) следует перенаправить на запись /dev/null
, которая отбрасывает все, что написано на него.
2>&1
затем перенаправляет файловый дескриптор 2 ( 2>
) к тому, к какому файловому дескриптору 1 в данный момент привязан ( &1
).
Ярлык для того, когда вы хотите перенаправить оба stdout
и stderr
в одно и то же место, должен использоваться &>
как в &> /dev/null
. Однако это поддерживается не во всех оболочках.
Таким образом, указав, > /dev/null 2>&1
вы указываете системе, что вы хотите перенаправить стандартный вывод команды в / dev / null, а затем перенаправить стандартную ошибку в стандартный вывод (который, в свою очередь, перенаправляется в / dev / null). Это заставляет команду замолчать, отбрасывая все выходные данные, которые отправляются либо в stdout, либо в stderr.
Обратите внимание, что некоторые программы используют альтернативные способы рисования на экране, такие как библиотека терминалов, например, ncurses, и, как правило, не будут затронуты этим или будут затронуты неожиданным образом. Но для программ, написанных для использования в конвейерном режиме (включая большинство программ, которые выводят простой текст в терминал), это работает.
В ||
свою очередь, это означает, что если программа возвращает состояние выхода, отличное от 0 (где по соглашению 0 означает успешное выполнение), то оболочка вызовет команду на другой стороне ||
, что в данном случае является true
. Не путайте это с обычным каналом, который использует один |
и привязывает левый стандартный вывод к правому стандартному каналу. Противоположным ||
является то, &&
что правая сторона выполняется только в том случае, если левая сторона возвратила состояние выхода 0, а дополнительная - ;
просто разделяет несколько команд (вторая команда будет выполнена независимо от состояния выхода первой команды). ).
true
В свою очередь, это очень простая программа, единственной целью которой является выход с успешным статусом. Обычно это не очень полезно, но может быть очень полезно, например, при написании условных выражений в сценариях оболочки. Его противоположность - false
выход из состояния отказа (ненулевой), но в противном случае, как и в случае истины, ничего не происходит.
Таким образом, добавляя || true
после команды, вы знаете, что в любом случае что-то будет успешно выполнено к тому времени, как завершится выполнение набора команд. Таким образом, вы знаете, что текущий код состояния (доступен в $?
) всегда будет указывать на успешное выполнение.