Ik doe niet erg veel shell-scripts, dus ik was een beetje verrast toen ik las de documentatie voor git submodule
en ik zag de syntaxis die ze in deze documentatie gebruikten:
A niet-nul terugkeer van het commando in een submodule zorgt ervoor dat de verwerking wordt beëindigd. Dit kan worden opgeheven door
|| :
toe te voegen aan het einde van het commando.
Ik moest opzoeken dat || :
een afkorting was om een commando te forceren om succesvol af te sluiten. Elke keer dat ik een commando succesvol moest afsluiten , Ik heb || true
gebruikt. Wordt || :
als idiomatischer beschouwd?
Reacties
Antwoord
true
is niet in de Bourne-shell ingebouwd. :
was dat altijd (het was de manier om opmerkingen in te voeren voordat #
werd geïntroduceerd).
Dat, en omdat het is korter om te typen is waarschijnlijk de belangrijkste reden waarom mensen :
verkiezen boven true
.
Let op nog een verschil in POSIX-shells (voor bash
, alleen in POSIX-modus): terwijl true
een normale ingebouwde is (hoeft niet eens te worden ingebouwd) , :
is een speciale ingebouwde versie. Dat heeft een paar implicaties, waarvan de meeste in dit specifieke geval waarschijnlijk geen impact hebben:
-
Als een
:
-opdracht mislukt, inclusief vanwege een mislukte omleiding, waardoor de shell wordt afgesloten. In de praktijk zal dat waarschijnlijk “geen verschil maken, tenzij u omleidingen doorgeeft aan:
$ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE
-
in
var=value :
,var
blijft ingesteld opvalue
na:
retourneert, niet in het geval vantrue
:$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1
Merk ook op dat || true
werkt in shells van de rc
en csh
families maar niet || :
(maar niet om set -e
in csh
te annuleren).
|| :
is niet hetzelfde als :
. Het betekent of voer :
anders (dat wil zeggen, als de voorgaande pijplijn mislukt).
set -e false
Zou ervoor zorgen dat de shell wordt afgesloten vanwege set -e
(ook bekend als de errexit
optie) en heeft een exitstatus die niet gelijk is aan nul (fout). Het set -e
effect wordt geannuleerd als de opdracht die een exitstatus anders dan nul retourneert, wordt gebruikt als een voorwaarde zoals in:
if false; then ... while false; do ... false && : ... false || : ...
false && :
annuleert alleen set -e
. false || :
annuleert het effect van set -e
en stelt de afsluitstatus in op 0
, dus idiomatischer om te zeggen dat we een mislukte afsluitcode van de opdracht willen negeren. De meesten zouden beweren dat || true
beter leesbaar is (de bedoeling duidelijker weergeeft).
Opmerkingen
-
&& :
is briljant, zijn er documenten of meer informatie hierover? Google schiet tekort bij het vinden van dit soort trefwoorden …
Antwoord
De meeste van deze antwoorden slagen er niet in behandelen het meest voorkomende gebruik van :
.
Ten eerste is deze discussie niet gerelateerd aan een shell die geen Bourne shell (sh
) afgeleide. Dat gezegd hebbende, zien alle van Bourne afgeleide shells true
en :
als hetzelfde. Programmeurs werden vroeger aangemoedigd om :
te gebruiken in plaats van true
, omdat :
altijd een ingebouwd terwijl er gevallen waren waarin true
niet altijd een ingebouwde was.
:
heeft twee toepassingen. Het is geen synoniem voor #
, maar het heeft een andere functie. Bij het debuggen van uw script onder een set -x
, worden regels waarin #
wordt gebruikt door de parser verwijderd en totaal genegeerd, terwijl regels met :
worden geparseerd en geëvalueerd. Dit is erg handig bij het debuggen, aangezien onder -x
die regels worden weergegeven en hun waarde na evaluatie wordt weergegeven.Het is alsof je print
instructies in je code plaatst die alleen worden weergegeven in de modus -x
. Wees voorzichtig met de waarden achter de :
aangezien het echte code is en de bijwerkingen van invloed kunnen zijn op uw programma.
Opmerkingen
- Wat is het tweede gebruik?
Antwoord
Over het algemeen, in bash, de dubbele punt :
en true
zijn gelijkwaardig.
Is | | : beschouwd als idiomatischer?
Ik denk dat het gebaseerd is op de context .
Als u een return value
wilt, of een condition
is altijd waar , moet u het trefwoord true
gebruiken, het zal uw code duidelijker maken en de kijkers laten weten dat u de waarde wilt benadrukken true , dwz:
while true; do something
of
<commnad> RETURN_VALUE= $? || true
En als je niets wilt doen , of NOP
in de shell moet je dubbele punt :
if condition then : # DO NOTHING HERE else do something fi
of
||:
(zonder spatie) ook geldig is in bash. Het doet hetzelfde als|| :
of|| true
.