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
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 :, forblivervarsat tilvalueefter:vender tilbage, ikke i tilfælde aftrue:$ 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
||:(uden plads) også er gyldig i bash. Det gør det samme som|| :eller|| true.