Что значит> / dev / null 2> & 1 || правда значит в линуксе?

5775
Aso'K
"command "> /dev/null 2>&1 || true 

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

4

2 ответа на вопрос

9
a CVn

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

1
Alex

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

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

Похожие вопросы