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 :,varblijft ingesteld opvaluena: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.