Nu fac foarte multe scripturi shell, așa că am fost puțin surprins când citeam documentația pentru git submodule
și am văzut sintaxa pe care au folosit-o în această documentație:
A returnarea diferită de zero din comandă în orice submodul determină terminarea procesării. Acest lucru poate fi anulat prin adăugarea
|| :
la sfârșitul comenzii.
A trebuit să mă uit în sus că || :
a fost o prescurtare pentru a forța o comandă să iasă cu succes. Oricând a trebuit să fac o comandă să ieși cu succes , Am folosit || true
. Este || :
considerat a fi mai idiomatic?
Comentarii
Răspuns
true
nu a fost încorporat în shell-ul Bourne. :
a fost întotdeauna (era modul de a introduce comentarii înainte ca #
să fie introdus).
Asta și pentru că este mai scurt de scris este probabil principalul motiv pentru care oamenii preferă :
în locul true
.
Observați o altă diferență în Shells POSIX (pentru bash
, numai în modul POSIX): în timp ce true
este un program încorporat obișnuit (nici măcar nu trebuie încorporat) , :
este o versiune integrată special . Aceasta are câteva implicații, dintre care este puțin probabil să aibă vreun impact în acest caz particular:
-
Dacă o comandă
:
eșuează, inclusiv din cauza unei redirecționări eșuate, care determină ieșirea shell-ului. În practică, probabil că asta nu va face diferența decât dacă treceți redirecționări către:
$ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE
-
în
var=value :
,var
rămâne setat lavalue
după , nu în cazultrue
:$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1
Rețineți, de asemenea, că || true
funcționează în cochilii rc
și csh
familii, dar nu || :
(dar nu pentru a anula set -e
în csh
).
|| :
nu este același lucru cu :
. Înseamnă sau rulează :
altfel (adică, dacă conducta precedentă eșuează).
set -e false
Ar determina ieșirea shell-ului din cauza set -e
(alias opțiunea errexit
) și are o stare de ieșire diferită de zero (eșec). Efectul set -e
este anulat dacă comanda care returnează o stare de ieșire diferită de zero este utilizată ca condiție ca în:
if false; then ... while false; do ... false && : ... false || : ...
false && :
anulează numai set -e
. false || :
anulează efectul set -e
și stabilește starea de ieșire la 0
deci este mai idiomatic să spunem că vrem să ignorăm un cod de ieșire de eșec al comenzii. Majoritatea susțin că || true
este mai lizibil (transmite intenția mai clar).
Comentarii
-
&& :
este strălucit, există documente sau alte lecturi despre asta? Google nu reușește să găsească acest tip de cuvinte cheie …
Răspuns
Majoritatea acestor răspunsuri abordați cea mai obișnuită utilizare a :
.
În primul rând, această discuție nu are legătură cu niciun shell care nu este un Bourne shell (sh
) derivat. Acestea fiind spuse, toate shell-urile derivate Bourne consideră true
și :
ca același lucru. Programatorii erau încurajați să folosească :
în loc de true
, deoarece :
este întotdeauna un încorporat în timp ce existau cazuri în care true
nu era întotdeauna încorporat.
:
două utilizări. Nu este un sinonim pentru #
, dar are o funcție diferită. Când depanați scriptul sub un set -x
, liniile în care se utilizează #
sunt abandonate de analizor și sunt complet ignorate, în timp ce liniile cu :
sunt analizate și evaluate. Acest lucru este foarte util în depanare, deoarece în -x
sunt afișate acele linii și se afișează valoarea lor după evaluare.Este ca și cum ați introduce instrucțiuni print
în codul dvs. care se afișează numai în modul -x
. Aveți grijă cu valorile de după :
, deoarece acestea sunt cod real, iar efectele secundare vă pot afecta programul.
Comentarii
- Care este a doua utilizare?
Răspuns
În general, în bash, colon :
și true
este echivalent.
Is | | : considerat a fi mai idiomatic?
Cred că se bazează pe context .
Dacă doriți un return value
sau un condition
este întotdeauna adevărat , ar trebui să utilizați cuvântul cheie true
, acesta vă va face codul mai clar și va informa spectatorii că doriți să subliniați valoarea adevărat , adică:
while true; do something
sau
<commnad> RETURN_VALUE= $? || true
Și dacă doriți să nu faceți nimic sau NOP
în shell, ar trebui să utilizați colon :
if condition then : # DO NOTHING HERE else do something fi
sau
while conditon do : # DO NOTHING HERE done
||:
(fără spațiu) este valabil și în bash. Face același lucru ca|| :
sau|| true
.