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 :
, forblivervar
sat tilvalue
efter:
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
.