Что значит> /dev/null 2>&1 || правда значит в линуксе?
"command "> /dev/null 2>&1 || true
Теперь я понимаю, что мы отправляем вывод команды, которую мы запускаем, в нулевой файл. Мне нужно знать конкретное значение для *2>&1 || true*
2 ответа
TL;DR: >/dev/null 2>&1 || true
эффективно заставляет команду замолчать, отбрасывая любой (ошибочный или обычный) вывод и результат команды, но не любые ее побочные эффекты. Далее следует объяснение почему.
Программы Linux по умолчанию получают три файловых дескриптора, которые открываются до начала выполнения основного кода программы. Это stdin
(стандартный ввод, дескриптор файла 0), stdout
(стандартный вывод, дескриптор файла 1) и stderr
(стандартная ошибка, дескриптор файла 2). Они обычно привязаны к текущему терминалу, который сегодня фактически означает клавиатуру, экран и экран соответственно (но так было не всегда).
Указав > /dev/null
в команде (перенаправление обычно может происходить в любом месте команды, но по соглашению оно происходит в конце или очень редко в начале), вы указываете, что стандартный вывод (неявный 1
, но можно указать, используя 1>
вместо просто >
) следует перенаправить на /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
после команды вы знаете, что в любом случае что-то будет успешно выполнено к тому времени, как завершится выполнение набора команд. Таким образом, вы знаете, что текущий код состояния (доступен в $?
) всегда будет указывать на успешное выполнение.
Что означает "команда" > /dev/null 2>&1 || правда значит в линуксе?
2>&1
означает "перенаправление STDERR
(2) для STDOUT
(1)"
(STDERR
(Стандартная ошибка) имеет предопределенный дескриптор файла, равный 2
а также STDOUT
(стандартный вывод) дескриптор файла равен 1)
>
- такой же как 1>
и означает перенаправление STDOUT
к чему-то
Тогда вся операция будет переведена как:
command > /dev/null 2>&1
- перенаправить файловые дескрипторы STDOUT и STDERR в "черную дыру" или в основном игнорировать все выходные данные command
("черная дыра" или /dev/null
это специальное устройство, которое принимает ввод и игнорирует его внутри)
относительно || true
- Если command
вернуть не 0 (ноль) статус выхода (что обычно указывает на какой-то тип ошибки / сбоя) true
принудительно установите код состояния выхода на 0 (ноль), что указывает на успех.