Vraag Welke is beter: gebruiken; of && om meerdere opdrachten op één regel uit te voeren?


In tutorials en how-to's zie ik opdrachten vaak gecombineerd. Bijvoorbeeld,

sudo apt-get update && sudo apt-get install pyrenamer

Er lijken vier mogelijke connectoren te zijn: &, &&, || en ;. Hoewel de &  connector is voor mij duidelijk (het stuurt een proces naar de achtergrond en laat de terminal beschikbaar), het is niet duidelijk wat het verschil is tussen && en ;. En ik wist het niet || tot de opmerking van Kaya.

De volgende vragen gaan over het verschil tussen de twee connectors, maar doen dit vooral in de opmerkingen:

Dus hier zijn een aantal gerelateerde vragen:

  1. Wat is het verschil tussen ; en &&?
  2. Wanneer moet je ze gebruiken? respectievelijk? Het zou leuk zijn om enkele use-cases te zien: als ik een opdracht wil uitvoeren en daarna mijn computer moet afsluiten, welke connector moet ik dan kiezen?
  3. Wat zijn hun voordelen en gevaren? Robie Basak vermeldt in een commentaar op dit antwoord dat een commando leuk vindt cd /somewhere_else; rm -Rf * kan destructieve gevolgen hebben als het eerste element in de commandoketting bijvoorbeeld faalt.
  4. Indien relevant, waar komen ze vandaan?

331
2017-08-20 16:41


oorsprong


Er is nog een connector die u mogelijk niet tegenkomt: ||is hetzelfde als && behalve dat het alleen de tweede opdracht uitvoert als de eerste wordt afgesloten met een niet-nul (niet-geslaagde) status. - Kaya
Merk ook op dat je je script uitvoert met set -e zal het script stoppen bij een fout alsof alle commando's verbonden waren &&. - choroba
stackoverflow.com/questions/3573742/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Niemand antwoordde Qn 4 ... Ik vermoed het gedrag van && en || werd geïnspireerd door de programmeertaal C. In het geval van (x en& y), als x evalueert tot false, moet de hele expressie false zijn, zodat een compiler de evaluatie van y zou kunnen optimaliseren, voor het geval het duur zou zijn. De moderne C- en C ++ -standaarden eigenlijk vereisen deze optimalisatie, zodat programma's veilig kunnen aannemen dat y niet zal worden geëvalueerd als x false is. Bijvoorbeeld, (ptr && ptr-> dagen> 31) zal niet crashen, zelfs als ptr null is. Ook in C eindigen statements met; ongeacht of er een andere verklaring op dezelfde regel is of niet. - Kevin


antwoorden:


Spiek briefje:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

606
2017-10-20 11:02



En natuurlijk, A & B &: Voer A uit op de achtergrond en voer B op de achtergrond in (ongeacht het succes) en stuur de shell terug. Dit werkt vaak ongeveer hetzelfde als het gelijktijdig uitvoeren van beide processen. - Limited Atonement
is het mogelijk om te zeggen: voer a in achtergrond uit, gevolgd door b in achtergrond alleen als een werkte? ( Denk ik &&& ?) - user230910
@ user230910: dat zou zo zijn (A && B) &. - leftaroundabout
Kunt u hiernaar verwijzen naar een gezaghebbend document? - Jaime Hablutzel
@Jack Als het wordt uitgevoerd vanuit Cronjob, volgt het niet helemaal deze regel, geen idee waarom? Voor een python-bestand - CodeGuru


&& voert alleen de tweede opdracht uit als de eerste werd afgesloten met status 0 (was succesvol). ; voert beide opdrachten uit, zelfs als de eerste wordt afgesloten met een niet-nul-status.

Jouw voorbeeld met && kan op dezelfde manier worden geparafraseerd als

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

77
2017-08-20 16:46



Bedankt. Ik heb de vraag bijgewerkt om ervoor te zorgen dat de verschillende subvragen gemakkelijk te onderscheiden zijn. - don.joey
@Private: u zou moeten gebruiken ; als het tweede commando de vorige niet nodig heeft om te slagen. - choroba


Gebruik makend van ; zal de commando's uitvoeren ongeacht of het eerste commando succesvol is of niet.

gebruik makend van && voer het 2e commando alleen uit als het eerste commando met succes is uitgevoerd (status 0).

Beide worden in een ander perspectief gebruikt. Net als voor een langer proces, bijvoorbeeld voor een installatie die je moet compileren en installeren. je zou moeten make && make install. Dus de installatie wordt alleen uitgevoerd als make succesvol.

Dus voor afhankelijke commando's die je zou moeten gebruiken &&

Wring bash of commando's met onafhankelijke commando's gebruiken ; 

Dus als u de computer wilt afsluiten, kan zelfs de eerste taak niet worden gebruikt ; , maar als het willen bij volledig succes van de eerste taak het afsluiten van het gebruik initiëren &&


28
2017-08-20 16:50



Bedankt. Ik vind de laatste gebruikscase die je presenteert leuk. Ik heb de vraag bijgewerkt. - don.joey


a ; b zal b uitvoeren, ongeacht de exitstatus van a. a && b wordt alleen b uitgevoerd als dit is gelukt.

Dit is nodig en voldoende om de eerste 3 vragen te beantwoorden. In het bijzonder, de 2 is te breed en kan niet "één" definitief antwoord worden gegeven - u kunt het beste per geval beslissen.

Wat betreft de vierde vraag: Het zijn Bash-syntaxis.

Er is geen intrinsiek gevaar bij het gebruik van een van beide. Nogmaals, de bovenstaande definitie is voldoende. Het impliceert dat je zult schrijven && wanneer b heeft onbedoelde effecten als a lukt niet. Er is geen behoefte aan verdere regels of uitleg, IMHO.


13
2017-08-20 21:05