Jeg gjør ikke veldig mye skallskripting, så jeg ble litt overrasket da jeg leste dokumentasjonen for git submodule
og jeg så syntaksen de brukte i denne dokumentasjonen:
A ikke-null retur fra kommandoen i en hvilken som helst undermodul får behandlingen til å avsluttes. Dette kan overstyres ved å legge til
|| :
til slutten av kommandoen.
Jeg måtte slå opp at || :
var en stenografi for å tvinge en kommando til å avslutte med hell. Hver gang jeg har måttet gjøre en kommandoutgang vellykket , Jeg brukte || true
. Anses || :
for å være mer idiomatisk?
Kommentarer
Svar
true
ble ikke bygget inn i Bourne-skallet. :
var alltid (det var måten å legge inn kommentarer før #
ble introdusert).
Det, og fordi det er kortere å skrive er sannsynligvis den viktigste grunnen til at folk foretrekker :
fremfor true
.
Legg merke til en annen forskjell i POSIX-skjell (for bash
, bare i POSIX-modus): mens true
er en vanlig innebygd (trenger ikke engang å være innebygd) , :
er en spesiell innebygd. Det har noen få implikasjoner, hvorav de fleste neppe vil ha noen innvirkning i dette spesielle tilfellet:
-
Hvis en
:
-kommando mislykkes, inkludert på grunn av en mislykket omdirigering, som får skallet til å gå ut. I praksis vil det sannsynligvis ikke gjøre noen forskjell med mindre du sender viderekoblinger 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 :
, forblirvar
satt tilvalue
etter:
returnerer, ikke når det gjeldertrue
:$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1
Vær også oppmerksom på at || true
fungerer i skjell av rc
og csh
familier men ikke || :
(men ikke å avbryte set -e
i csh
).
|| :
er ikke det samme som :
. Det betyr eller kjør :
ellers (det vil si hvis den foregående rørledningen mislykkes).
set -e false
Vil føre til at skallet går ut på grunn av set -e
(aka errexit
alternativet) og har en utgangsstatus som ikke er null (feil). set -e
-effekten blir kansellert hvis kommandoen som returnerer en exit-status som ikke er null, brukes som en tilstand som i:
if false; then ... while false; do ... false && : ... false || : ...
false && :
kansellerer bare set -e
. false || :
avbryter effekten av set -e
og setter utgangsstatus til 0
så er det mer idiomatisk å si at vi ønsker å ignorere en feilutgangskode for kommandoen. De fleste vil hevde at || true
er mer leselig (formidler intensjonen tydeligere).
Kommentarer
-
&& :
er strålende, er det noen dokumenter eller ytterligere lesing om dette? Google kommer ikke til å prøve å finne denne typen nøkkelord …
Svar
De fleste av disse svarene mislykkes adressere den vanligste bruken av :
.
Først er denne diskusjonen ikke relatert til noe skall som ikke er et Bourne shell (sh
) derivat. Når det er sagt, ser alle Bourne-avledede skall true
og :
som det samme. Tidligere ble programmerere oppfordret til å bruke :
i stedet for true
, fordi :
alltid er en innebygd mens det tidligere var tilfeller der true
ikke alltid var en innebygd.
:
har to bruksområder. Det er ikke et synonym for #
, men det har en annen funksjon. Når du feilsøker skriptet ditt under en set -x
, slippes linjene der #
brukes av parseren og ignoreres fullstendig, mens linjer med :
blir analysert og evaluert. Dette er veldig nyttig i feilsøking siden under -x
disse linjene vises og verdien deres etter evaluering vises.Det er som å sette print
utsagn i koden din som bare vises under -x
-modus. Vær forsiktig med verdiene etter :
siden de er ekte kode og bivirkningene kan påvirke programmet ditt.
Kommentarer
- Hva er den andre bruken?
Svar
Generelt sett i bash er kolon :
og true
tilsvarer.
Er | | : ansett for å være mer idiomatisk?
Jeg tror det er basert på kontekst .
Hvis du vil ha en return value
, eller en condition
er alltid sant , bør du bruke true
søkeord, det vil gjøre koden din tydeligere og fortelle seerne at du vil understreke verdien sant , dvs.:
while true; do something
eller
<commnad> RETURN_VALUE= $? || true
Og hvis du vil gjør ingenting , eller NOP
i skallet, bør du bruke kolon :
if condition then : # DO NOTHING HERE else do something fi
eller
while conditon do : # DO NOTHING HERE done
||:
(uten mellomrom) også er gyldig i bash. Det gjør det samme som|| :
eller|| true
.