4
"command "> /dev/null 2>&1 || true  

Теперь я понимаю, что мы отправляем вывод команды, которую мы запускаем, в нулевой файл. Мне нужно знать конкретное значение для *2>&1 || true*

2 ответа2

10

TL; DR: >/dev/null 2>&1 || true Значение 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 . Не путайте это с обычной трубкой, которая использует один | и связывает левый стандартный вывод с правым стандартным. Противоположность || is && которая выполняет правую часть только в том случае, если левая сторона возвратила состояние выхода 0, а дополнительная - ; который просто разделяет несколько команд (вторая команда будет выполнена независимо от состояния выхода первой команды).

true , в свою очередь, это очень простая программа, единственной целью которой является выход с успешным статусом. Обычно это не очень полезно, но может быть очень полезно, например, при написании условных выражений в сценариях оболочки. Его противоположность - false которая завершается с ошибочным (ненулевым) статусом, но в противном случае, как и истина, ничего не делает.

Таким образом, добавив || true после команды, вы знаете, что в любом случае что-то будет успешно выполнено к тому времени, как завершится выполнение набора команд. Таким образом, вы знаете, что текущий код состояния (доступно в $?) всегда будет указывать на успешное выполнение.

1

Что означает "команда"> /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 (ноль), что указывает на успех.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .