Вопрос: Что делает> / dev / null 2> & 1 || true в Linux?


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

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


4
2018-02-17 12:11


Источник




Ответы:


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, Не путайте это с обычной трубой, которая использует один | и связывает левый стандартный вывод с правым stdin. Противоположно || является && который выполняет правую часть, только если левая сторона вернула статус выхода 0, а дополнительная ; который просто отделяет несколько команд (вторая команда будет выполнена независимо от состояния выхода первой команды).

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

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


9
2018-02-17 12:50





Что значит «command»> / dev / null 2> & 1 || true в Linux?

2>&1 означает "перенаправление STDERR(2) - STDOUT(1)»
(STDERR (Стандартная ошибка) имеет предопределенный файловый дескриптор, равный 2
а также STDOUT(стандартный вывод) дескриптор файла равен 1)

> - такой же как 1> и означает перенаправление STDOUT к чему-то

Затем вся операция будет переведена как:

command > /dev/null 2>&1 - перенаправить дескрипторы файлов STDOUT и STDERR в «черную дыру» или в основном игнорировать все выходы command
(«черная дыра» или /dev/null это специальное устройство, которое принимает вход и внутренне игнорирует его)

относительно || true - Если command return non 0 (zero) exit (что обычно указывает на некоторый тип ошибки / сбоя), тогда true код состояния выхода принудительного набора до 0 (ноль), указывающий на успех.


1
2018-02-17 12:17



В частности, 2>&1 означает «перенаправить STDERR (2) в STDOUT (1)». - quixotic
@quixotic Спасибо! Добавлена ​​ваша заметка к ответу. - Alex