Noe som er mer idiomatisk i et bash-skript: `|| true` eller `|| : `?

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

  • Det ' er verdt å merke seg at ||: (uten mellomrom) også er gyldig i bash. Det gjør det samme som || : eller || true.

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 :, forblir var satt til value etter : returnerer, ikke når det gjelder true:

    $ 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 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *