Я смотрю на код сценария оболочки, и я не знаю, в чем цель двойного канала (||), за которым следует двоеточие (:), может кто-нибудь объяснить? например,Что делает || : среднее значение в оболочке?
$ <some_command> >/dev/null 2>&1 || :
Я смотрю на код сценария оболочки, и я не знаю, в чем цель двойного канала (||), за которым следует двоеточие (:), может кто-нибудь объяснить? например,Что делает || : среднее значение в оболочке?
$ <some_command> >/dev/null 2>&1 || :
||
является булевым или.
:
- команда no-op, которая ничего не делает и выходит с правдивым статусом.
Таким образом, anything || :
безоговорочно возвращает true.
Таким образом, some_command_that_may_fail ||:
всегда будет успешным.
Это важно, если используется set -e
или ERR-ловушка, но вы не хотите, чтобы ваш скрипт вышел или вызвал ошибку, если команда не удалась.
: двоеточие Noop, двойная труба является операция ИЛИ, так что ...
выполнить some_command ИЛИ (в случае some_command не может) выполнить: (который не является никакой операции)
|| означает выполнение второго, только если первая команда команды завершилась с ошибкой. В этом случае вторая команда означает «ничего не делать»
Не совсем «ничего не делать»: установите статус выхода в «true», –
Ничего себе, поэтому это должно быть запрещено тогда :) это хуже пустых блоков try-catch. Благодаря! – theMarceloR
Почему запрещено? Иногда вам действительно все равно, если команда терпит неудачу. Например, 'grep' терпит неудачу, если он не находит совпадения, но вы не можете считать, что ошибка в вашем скрипте, поэтому' grep string file.txt || : 'предотвратит запуск скрипта. – chepner
@theMarceloR, я бы не сказал худшего - он очень явственен в строчном порядке, и иногда его требуют. Если вы используете код обработки ошибок, то иногда вам действительно нужно/нужно провалиться и продолжить очистку, если его часть не удалась. –