Я не слишком много пишу сценариев оболочки, поэтому я немного удивился, когда читал документациюgit submodule
и увидел синтаксис, который они использовали в этой документации:
Ненулевой возврат команды в любом подмодуле приводит к прекращению обработки. Это можно переопределить, добавив
|| :
в конец команды.
Я должен был посмотреть, что || :
было условием для принудительного завершения команды. Каждый раз, когда мне нужно было успешно выполнить команду выхода, я использовал || true
. Является ли || :
считается более идиоматических?
||:
(без пробела) также действует в bash. Он делает то же самое, что и|| :
или|| true
.Ответы:
true
не был встроен в оболочку Борна.:
всегда был (это был способ ввода комментариев, прежде чем#
был представлен).Это, а также потому , что это короче типа, вероятно , главная причина , люди предпочитают
:
болееtrue
.Обратите внимание на другое различие в оболочках POSIX (для
bash
, только в режиме POSIX): хотяtrue
обычная встроенная функция (даже не требуется встроенная),:
это специальная встроенная функция. Это имеет несколько последствий, большинство из которых вряд ли окажут какое-либо влияние в данном конкретном случае:Если
:
команда не выполняется, в том числе из-за сбоя перенаправления, это приводит к выходу оболочки. На практике это, вероятно, не будет иметь значения, если вы не передадите перенаправления:
в
var=value :
,var
остается установленнымvalue
после:
возврата, не в случаеtrue
:Также обратите внимание, что
|| true
работает в оболочкахrc
иcsh
семьях, но не|| :
(но не отменитьset -e
вcsh
).|| :
это не то же самое, что:
. Это означает или работает:
иначе (то есть, если предыдущий конвейер не работает).Будет ли вызвать оболочку для выхода из - за
set -e
иfalse
имеет статус выхода не равен нулю (ошибка).set -e
Эффект будет отменен , если команда , которая возвращает ненулевой код выхода используется в качестве условия , как в:false && :
только отменяетset -e
.false || :
отменяетset -e
и устанавливает состояние выхода,0
так что более идиоматично говорить, что мы хотим игнорировать код завершения сбоя команды. Большинство будет утверждать, что|| true
это более разборчиво (передает намерение более четко).источник
&& :
это замечательно, есть какие-нибудь документы или дальнейшее чтение по этому вопросу? GoogleОбычно в bash двоеточие
:
иtrue
эквивалентно.Я думаю, что это основано на контексте .
Если вы хотите
return value
, чтобы a или acondition
всегда было true, вам следует использоватьtrue
ключевое слово, это сделает ваш код более четким и позволит зрителям понять, что вы хотите подчеркнуть значение true , то есть:или
И если вы хотите ничего не делать , или
NOP
в оболочке, вы должны использовать двоеточие:
или
источник
Большинство из этих ответов не относятся к наиболее распространенному использованию
:
.Во-первых, это обсуждение не относится к какой-либо оболочке, не являющейся производной оболочки Борна (
sh
). Тем не менее, все производные оболочки Борна видятtrue
и:
как одно и то же. Программисты раньше поощрялись к использованию,:
а неtrue
потому, что они:
всегда были встроенными, в то время как были случаи, когда ониtrue
не всегда были встроенными.:
имеет два использования. Это не синоним для#
, но у него другая функция. При отладке вашего скрипта в aset -x
строки, где#
он используется, отбрасываются анализатором и полностью игнорируются, тогда как строки с:
анализируются и оцениваются. Это действительно полезно при отладке, поскольку под-x
этими строками отображаются и отображаются их значения после оценки. Это все равно что помещатьprint
в ваш код операторы, которые отображаются только в-x
режиме. Будьте осторожны со значениями после,:
поскольку они представляют собой реальный код, и побочные эффекты могут повлиять на вашу программу.источник