Ceea ce este mai idiomatic într-un script bash: `|| adevărat` sau `|| : `?

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

  • Este ' merită remarcat faptul că ||: (fără spațiu) este valabil și în bash. Face același lucru ca || : sau || true.

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 la value după , nu în cazul true:

    $ 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 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *