Hvilket er mere idiomatisk i et bash-script: `|| sandt eller || : `?

Jeg laver ikke meget shell-scripting, så jeg blev lidt overrasket, da jeg læste dokumentationen til git submodule og jeg så syntaksen, de brugte i denne dokumentation:

A ikke-nul returnering fra kommandoen i en hvilken som helst undermodul får behandlingen til at afslutte. Dette kan tilsidesættes ved at tilføje || : til slutningen af kommandoen.

Jeg var nødt til at slå op, at || : var en stenografi for at tvinge en kommando til at afslutte med succes. Hver gang jeg har været nødt til at foretage en kommandoudgang med succes , Jeg brugte || true. Anses || : for at være mere idiomatisk?

Kommentarer

  • Det ' er værd at bemærke, at ||: (uden plads) også er gyldig i bash. Det gør det samme som || : eller || true.

Svar

true blev ikke indbygget i Bourne-skallen. : var altid (det var måde at indtaste kommentarer inden # blev introduceret).

Det og fordi det er kortere at skrive er sandsynligvis hovedårsagen til, at folk foretrækker : frem for true.

Bemærk en anden forskel i POSIX-skaller (for bash, kun i POSIX-tilstand): mens true er en almindelig indbygget (behøver ikke engang at være indbygget) , : er en special indbygget. Det har nogle få implikationer, hvoraf de fleste sandsynligvis ikke har nogen indflydelse i dette særlige tilfælde:

  • Hvis en : -kommando mislykkes, herunder på grund af en mislykket omdirigering, der får skallen til at afslutte. I praksis vil det sandsynligvis ikke gøre en forskel, medmindre du sender omdirigeringer til :

    $ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE 
  • i var=value :, forbliver var sat til value efter : vender tilbage, ikke i tilfælde af true:

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

Bemærk også, at || true fungerer i skaller af rc og csh familier men ikke || : (men ikke for at annullere set -e i csh).

|| : er ikke det samme som :. Det betyder eller kør : ellers (det vil sige, hvis den foregående pipeline mislykkes).

set -e false 

Vil få shell til at afslutte på grund af set -e (aka errexit option) og har en udgangsstatus, der ikke er nul (fejl). set -e -effekten annulleres, hvis den kommando, der returnerer en status, der ikke er nul, bruges som en tilstand som i:

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

false && : annullerer kun set -e. false || : annullerer effekten af set -e og indstiller exit-status til 0 så det er mere idiomatisk at sige, at vi vil ignorere en fiasko udgangskode for kommandoen. De fleste vil hævde, at || true er mere læselig (formidler formålet mere tydeligt).

Kommentarer

  • && : er strålende, er der nogen dokumenter eller yderligere læsning om dette? Google kommer ikke til at forsøge at finde denne slags nøgleord …

Svar

De fleste af disse svar kan ikke adresser den mest almindelige brug af :.

Først er denne diskussion ikke relateret til nogen shell, der ikke er en Bourne shell (sh) derivat. Når det er sagt, ser alle Bourne-afledte skaller true og : som den samme ting. Programmører blev tidligere opfordret til at bruge : i stedet for true, fordi : altid er en indbygget, mens der tidligere var tilfælde, hvor true ikke altid var en indbygget.

: har to anvendelser. Det er ikke et synonym for #, men det har en anden funktion. Når du fejler dit script under en set -x, falder linjer, hvor # bruges, af parseren og ignoreres fuldstændigt, mens linjer med : analyseres og evalueres. Dette er virkelig nyttigt ved fejlfinding, da under -x disse linjer vises, og deres værdi efter evaluering vises.Det er som at sætte print udsagn i din kode, der kun vises under -x -tilstand. Vær forsigtig med værdierne efter :, da de er ægte kode, og bivirkningerne kan påvirke dit program.

Kommentarer

  • Hvad er den anden brug?

Svar

Generelt i bash er kolon : og true er ækvivalent.

Er | | : betragtes som mere idiomatisk?

Jeg tror, det er baseret på kontekst .

Hvis du vil have en return value, eller en condition er altid sandt , skal du bruge true nøgleord, det vil gøre din kode tydeligere og lade seerne vide, at du vil understrege værdien sand , dvs.:

while true; do something 

eller

<commnad> RETURN_VALUE= $? || true 

Og hvis du vil skal du ikke gøre noget eller NOP i shell skal du bruge kolon :

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

eller

while conditon do : # DO NOTHING HERE done 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *