Mikä on idiomaattisempi bash-käsikirjoituksessa: `|| tosi tai `|| : `?

En tee kovin paljon komentosarjoja, joten olin hieman yllättynyt lukiessani git submodule -oppaat ja näin heidän käyttämänsä syntaksin tässä dokumentaatiossa:

A palautus nollasta poikkeavasta komennosta missä tahansa alimoduulissa saa käsittelyn loppumaan. Tämä voidaan ohittaa lisäämällä || : komennon loppuun. 8297834f08 ”>

Minun oli pakko etsiä, että || : oli lyhenne komennon pakottamiseksi poistumaan onnistuneesti. Aina kun minun oli tehtävä komento poistutaan onnistuneesti , Käytin || true. Onko || : pidetty idiomaattisempana?

Kommentit

  • Se ' on syytä huomata, että ||: (ilman välilyöntiä) pätee myös bashissa. Se tekee saman asian kuin || : tai || true.

Vastaa

true ei ole rakennettu Bourne-kuoreen. : oli aina (se oli tapa kirjoittaa kommentteja ennen # käyttöönottoa).

Se, ja koska se on lyhyempi kirjoittaa on luultavasti tärkein syy, miksi ihmiset pitävät :: ää true: n sijaan.

Huomaa toinen ero POSIX-kuoret (bash, vain POSIX-tilassa): kun true on tavallinen sisäänrakennettu (ei tarvitse edes rakentaa) , : on erityinen sisäänrakennettu. Tällä on muutama merkitys, joista useimmilla ei todennäköisesti ole vaikutusta tässä tapauksessa:

  • Jos : -komento epäonnistuu, mukaan lukien epäonnistuneen uudelleenohjauksen takia, mikä saa kuoren poistumaan. Käytännössä sillä ei todennäköisesti ole merkitystä, ellet ohjaa uudelleenohjauksia osoitteeseen :

    $ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE 
  • kohdassa var=value : var pysyy asetettuna arvoon value : palauttaa, ei true:

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

Huomaa myös, että || true toimii rc ja csh perheitä, mutta ei || : (mutta ei peruuttaaksesi set -e ryhmässä csh).

|| : ei ole sama kuin :. Se tarkoittaa tai ajaa : muuten (ts. jos edellinen putki epäonnistuu).

set -e false 

Saisi kuoren poistumaan set -e (alias vaihtoehto errexit ja -tilan poistumistila on nolla (vika). set -e -vaikutus peruutetaan, jos komentoa, joka palauttaa nollasta poikkeavan tilan, käytetään ehdona kuten:

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

false && : peruuttaa vain set -e. false || : peruuttaa set -e -vaikutuksen ja asettaa poistumistilaksi 0, joten se on idiomaattisempi sanoa, että haluamme jättää huomiotta komennon vian poistumiskoodin. Useimmat väittävät, että || true on luettavampi (välittää tarkoituksen selkeämmin).

Kommentit

  • && : on loistava, onko tästä mitään asiakirjaa tai lisälukemista? Google puuttuu minusta yrittäessäni löytää tällaisia avainsanoja …

Vastaus

Suurin osa näistä vastauksista epäonnistuu osoite :: n yleisimpään käyttöön.

Ensinnäkin tämä keskustelu ei liity mihinkään kuoreen, joka ei ole Bourne-kuoren (sh) johdannainen. Kaikissa Bournen johdannaiskuorissa true ja : on sama asia. Ohjelmoijia kehotettiin käyttämään : true: n sijasta, koska : on aina sisäänrakennettu, vaikka aiemmin oli tapauksia, joissa true ei aina ollut sisäänrakennettu.

: on kaksi käyttötarkoitusta. Se ei ole # -synonyymi, mutta sillä on erilainen toiminto. Kun virheenkorjaat komentosarjaasi set -x -kohdassa, jäsennin hylkää rivit, joissa käytetään #, kun taas : jäsennetään ja arvioidaan. Tämä on todella hyödyllistä virheenkorjauksessa, koska kohdassa -x nämä rivit näytetään ja niiden arvo arvioinnin jälkeen näytetään.Se on kuin laittaa koodiin print -lausekkeet, jotka näkyvät vain -x -tilassa. Ole varovainen : -kohdan jälkeisten arvojen suhteen, koska ne ovat todellinen koodi ja sivuvaikutukset voivat vaikuttaa ohjelmaasi.

Kommentit

  • Mikä on toinen käyttö?

Vastaa

Yleensä bashissa kaksoispiste : ja true on vastaava.

On | | : pidetään idiomaattisempana?

Luulen, että se perustuu -kontekstiin .

Jos haluat return value, tai condition on aina totta , käytä true avainsanaa, se tekee koodistasi selkeämmän ja ilmoittaa katsojille, että haluat korostaa arvoa true , ts:

while true; do something 

tai

<commnad> RETURN_VALUE= $? || true 

Ja jos haluat tehdä mitään tai NOP kuoressa, käytä kaksoispistettä :

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

tai

while conditon do : # DO NOTHING HERE done 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *