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 :
var
pysyy 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
.