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
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 :varpysyy asetettuna arvoonvalue:palauttaa, eitrue:$ 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
||:(ilman välilyöntiä) pätee myös bashissa. Se tekee saman asian kuin|| :tai|| true.