Wat idiomatischer is in een bash-script: `|| waar` of `||

Ik doe niet erg veel shell-scripts, dus ik was een beetje verrast toen ik las de documentatie voor git submodule en ik zag de syntaxis die ze in deze documentatie gebruikten:

A niet-nul terugkeer van het commando in een submodule zorgt ervoor dat de verwerking wordt beëindigd. Dit kan worden opgeheven door || : toe te voegen aan het einde van het commando.

Ik moest opzoeken dat || : een afkorting was om een commando te forceren om succesvol af te sluiten. Elke keer dat ik een commando succesvol moest afsluiten , Ik heb || true gebruikt. Wordt || : als idiomatischer beschouwd?

Reacties

  • Het ' s vermeldenswaard dat ||: (zonder spatie) ook geldig is in bash. Het doet hetzelfde als || : of || true.

Antwoord

true is niet in de Bourne-shell ingebouwd. : was dat altijd (het was de manier om opmerkingen in te voeren voordat # werd geïntroduceerd).

Dat, en omdat het is korter om te typen is waarschijnlijk de belangrijkste reden waarom mensen : verkiezen boven true.

Let op nog een verschil in POSIX-shells (voor bash, alleen in POSIX-modus): terwijl true een normale ingebouwde is (hoeft niet eens te worden ingebouwd) , : is een speciale ingebouwde versie. Dat heeft een paar implicaties, waarvan de meeste in dit specifieke geval waarschijnlijk geen impact hebben:

  • Als een : -opdracht mislukt, inclusief vanwege een mislukte omleiding, waardoor de shell wordt afgesloten. In de praktijk zal dat waarschijnlijk “geen verschil maken, tenzij u omleidingen doorgeeft aan :

    $ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE 
  • in var=value :, var blijft ingesteld op value na : retourneert, niet in het geval van true:

    $ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1 

Merk ook op dat || true werkt in shells van de rc en csh families maar niet || : (maar niet om set -e in csh te annuleren).

|| : is niet hetzelfde als :. Het betekent of voer : anders (dat wil zeggen, als de voorgaande pijplijn mislukt).

set -e false 

Zou ervoor zorgen dat de shell wordt afgesloten vanwege set -e (ook bekend als de errexit optie) en heeft een exitstatus die niet gelijk is aan nul (fout). Het set -e effect wordt geannuleerd als de opdracht die een exitstatus anders dan nul retourneert, wordt gebruikt als een voorwaarde zoals in:

if false; then ... while false; do ... false && : ... false || : ... 

false && : annuleert alleen set -e. false || : annuleert het effect van set -e en stelt de afsluitstatus in op 0, dus idiomatischer om te zeggen dat we een mislukte afsluitcode van de opdracht willen negeren. De meesten zouden beweren dat || true beter leesbaar is (de bedoeling duidelijker weergeeft).

Opmerkingen

  • && : is briljant, zijn er documenten of meer informatie hierover? Google schiet tekort bij het vinden van dit soort trefwoorden …

Antwoord

De meeste van deze antwoorden slagen er niet in behandelen het meest voorkomende gebruik van :.

Ten eerste is deze discussie niet gerelateerd aan een shell die geen Bourne shell (sh) afgeleide. Dat gezegd hebbende, zien alle van Bourne afgeleide shells true en : als hetzelfde. Programmeurs werden vroeger aangemoedigd om : te gebruiken in plaats van true, omdat : altijd een ingebouwd terwijl er gevallen waren waarin true niet altijd een ingebouwde was.

: heeft twee toepassingen. Het is geen synoniem voor #, maar het heeft een andere functie. Bij het debuggen van uw script onder een set -x, worden regels waarin # wordt gebruikt door de parser verwijderd en totaal genegeerd, terwijl regels met : worden geparseerd en geëvalueerd. Dit is erg handig bij het debuggen, aangezien onder -x die regels worden weergegeven en hun waarde na evaluatie wordt weergegeven.Het is alsof je print instructies in je code plaatst die alleen worden weergegeven in de modus -x. Wees voorzichtig met de waarden achter de : aangezien het echte code is en de bijwerkingen van invloed kunnen zijn op uw programma.

Opmerkingen

  • Wat is het tweede gebruik?

Antwoord

Over het algemeen, in bash, de dubbele punt : en true zijn gelijkwaardig.

Is | | : beschouwd als idiomatischer?

Ik denk dat het gebaseerd is op de context .

Als u een return value wilt, of een condition is altijd waar , moet u het trefwoord true gebruiken, het zal uw code duidelijker maken en de kijkers laten weten dat u de waarde wilt benadrukken true , dwz:

while true; do something 

of

<commnad> RETURN_VALUE= $? || true 

En als je niets wilt doen , of NOP in de shell moet je dubbele punt :

if condition then : # DO NOTHING HERE else do something fi 

of

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *