Использование ||после> / dev / null 2> & 1 ||{выход 1} - PullRequest
0 голосов
/ 25 сентября 2019

Я новичок в скриптах bash и пытаюсь понять следующую строку:

# Verify pre-req environment
command -v kubectl > /dev/null 2>&1 || { echo "kubectl pre-req is missing."; exit 1; }

Я понимаю эту часть: command -v kubectl > /dev/null 2>&1, поэтому, если она не работает или нет, мы перенаправляем вывод в / dev /ноль, в котором, если я правильно понимаю, означает игнорировать его во всех случаях.Так в каких случаях будет выполнена следующая строка?

{ echo "kubectl pre-req is missing."; exit 1; }

и как || ведет себя в этом случае?

Ответы [ 4 ]

2 голосов
/ 25 сентября 2019

Я понимаю эту часть: command -v kubectl > /dev/null 2>&1, поэтому, если она терпит неудачу или нет, мы перенаправляем вывод в / dev / null, в котором, если я правильно понимаю, это означает, что игнорировать его во всех случаях.

Вы неправильно поняли это;ни одна часть command -v kubectl > /dev/null 2>&1 не имеет никакого отношения к «если не получится» против «нет».

Скорее, > и 2> перенаправляют два разных типа вывода;> (или 1>) перенаправляет все, что команда записывает в стандартный вывод , а 2> перенаправляет все, что команда пишет в стандартная ошибка .Записывает ли команда что-либо в стандартный вывод, не зависит от того, завершится ли она успешно или нет;записывает ли он что-либо в стандартную ошибку, не зависит от того, завершится ли он успешно или нет;и то, записывает ли он что-либо в стандартный вывод, не зависит от того, записывает ли он что-либо в стандартную ошибку.

Например, вот команда, которая печатает как в стандартный вывод, так и в стандартную ошибку, а затем успешно возвращает:

( echo "this is on standard output" ; echo "this is on standard error" >&2 ; exit 0 )

, а вот тот, который печатает как на стандартный вывод, так и на стандартную ошибку, а затем дает сбой:

( echo "this is on standard output" ; echo "this is on standard error" >&2 ; exit 1 )

В отличие от этого, || действительно имеет отношение к тому, была ли команда выполнена успешно (выход с нуля) или сбой (выход с чем-то отличным от нуля).

1 голос
/ 25 сентября 2019

|| используется для условия ИЛИ в bash.

Для упрощенного примера давайте рассмотрим

 cmd1 || cmd2

Что происходит, если cmd1 завершается успешно (т.е. код выхода 0),тогда cmd2 НЕ будет выполнен.cmd2 будет выполняться только в случае сбоя cmd1.

Это одна из причин, по которой возвращение кодов выхода так важно.

Для получения более подробной информации, пожалуйста, посмотрите этот пост: Логические операторы (&&, -a, ||, -o) в баш

1 голос
/ 25 сентября 2019

|| является логическим или и действует на основе кода завершения предыдущей команды (0 означает истину, а другое значение - ложь).

В этом случае, он выполнит только часть эха, когда код выхода первой команды (kubectl ..) не равен 0 (т. е. не выполнен).exit 1 означает сбой всей команды, в противном случае код выхода будет равен 0 из команды echo.

1 голос
/ 25 сентября 2019

Если команда kubectl завершается с ненулевым состоянием выхода, будет выполнен код после ||.

$ sh -c 'exit 42' && echo "exit status zero" || echo "exit status non-zero"
exit status non-zero

$ sh -c 'exit 0' && echo "exit status zero" || echo "exit status non-zero"
exit status zero
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...