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 :,varrămâne setat lavaluedupă , 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.