Wat is het doel van “&&” in een shell-opdracht?

Voor zover ik weet, is het gebruik van &na het commando om het op de achtergrond uit te voeren.

Voorbeeld van &gebruik: tar -czf file.tar.gz dirname &

Maar hoe zit het met &&? (bekijk dit voorbeeld: https://serverfault.com/questions/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188)


Antwoord 1, autoriteit 100%

Met

&&kun je iets doen op basis van het feit of de vorige opdracht met succes is voltooid – daarom zie je het vaak geketend als do_something && do_something_else_that_depended_on_something.


Antwoord 2, autoriteit 99%

Bovendien heb je ook ||wat de logische or is, en ook ;wat slechts een scheidingsteken is en het maakt niet uit wat er met het commando is gebeurd.

$ false || echo "Oops, fail"
Oops, fail
$ true || echo "Will not be printed"
$  
$ true && echo "Things went well"
Things went well
$ false && echo "Will not be printed"
$
$ false ; echo "This will always run"
This will always run

Enkele details hierover zijn hier te vinden Lijsten met opdrachtenin de Bash-handleiding.


Antwoord 3, autoriteit 30%

opdrachtregel – wat is het doel van &&?

In shell, als je

. ziet

$ command one && command two

de bedoeling is om het commando dat volgt op de &&alleen uit te voeren als het eerste commando succesvol is. Dit is idiomatisch voor Posix-shells en wordt niet alleen in Bash gevonden.

Het is bedoeld om de uitvoering van het tweede proces te voorkomen als het eerste mislukt.

Het is je misschien opgevallen dat ik het woord ‘intentie’ heb gebruikt, en dat is niet voor niets. Niet alle programma’s hebben hetzelfde gedrag, dus om dit te laten werken, moet u begrijpen wat het programma als een “mislukking” beschouwt en hoe het hiermee omgaat door de documentatie en, indien nodig, de broncode te lezen.

Je shell beschouwt een retourwaarde van 0 voor waar, andere positieve getallen voor onwaar

Programma’s geven een signaalterug bij het afsluiten. Ze moeten 0 retourneren als ze met succes afsluiten, of groter dan nul als ze dat niet doen. Dit maakt een beperkte hoeveelheid communicatie tussen processen mogelijk.

De &&wordt AND_IFgenoemd in de posix shell-grammatica, die deel uitmaakt van een and_orlijstmet opdrachten, die ook de ||bevatten, een OR_IFmet soortgelijke semantiek.

Grammaticasymbolen, geciteerd uit de documentatie:

%token  AND_IF    OR_IF    DSEMI
/*      '&&'      '||'     ';;'    */

En de grammatica (ook geciteerd uit de documentatie), waaruit blijkt dat een willekeurig aantal AND_IFs (&&) en/of OR_IFs (||) kunnen aan elkaar worden geregen (zoals and_orrecursief wordt gedefinieerd):

and_or           :                         pipeline
                 | and_or AND_IF linebreak pipeline
                 | and_or OR_IF  linebreak pipeline

Beide operatoren hebben dezelfde prioriteit en worden van links naar rechts geëvalueerd (ze zijn links associatief). Zoals de documenten zeggen:

Een AND-ORlijst is een reeks van een of meer pijplijnen gescheiden door de
operatoren "&&"en "||".

Een lijst is een reeks van een of meer EN-OF-lijsten, gescheiden door de
operators ';'en '&'en optioneel beëindigd door ';', '&', of
.

De operatoren "&&"en "||"hebben dezelfde prioriteit en zijn
geëvalueerd met links associativiteit. Bijvoorbeeld, beide van de volgende:
commando’s schrijven alleen bar naar standaarduitvoer:

$ false && echo foo || echo bar
$ true || echo foo && echo bar
  1. In het eerste geval is de false een commando dat eindigt met de status 1

    $ false
    $ echo $?
    1
    

    wat betekent dat echo fooniet werkt(d.w.z. kortsluiting van echo foo). Vervolgens wordt het commando echo baruitgevoerd.

  2. In het tweede geval wordt true afgesloten met de code 0

    $ true
    $ echo $?
    0
    

    en daarom wordt echo fooniet uitgevoerd, dan wordt echo baruitgevoerd.


Antwoord 4, autoriteit 7%

Een vrij algemeen gebruik voor ‘&&’ is software aan het compileren met autotools. Bijvoorbeeld:

./configure --prefix=/usr && make && sudo make install

Als de configuratie slaagt, wordt make uitgevoerd om te compileren, en als dat lukt, wordt make als root uitgevoerd om het programma te installeren. Ik gebruik dit wanneer ik er meestal zeker van ben dat de dingen zullen werken, en het stelt me in staat om andere belangrijke dingen te doen, zoals stackoverflow bekijken en de voortgang niet ‘bewaken’.

Soms laat ik me echt meeslepen…

tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf

Ik doe dit wanneer ik bijvoorbeeld een Linux from scratch box maak.


Antwoord 5, autoriteit 5%

&&tekent commando’s bij elkaar. Opeenvolgende opdrachten worden alleen uitgevoerd als de voorgaande slagen.

Op dezelfde manier zal ||het volgende commando toestaan om uit te voeren als het voorgaande mislukt.

Zie Bash Shell-programmering.


Antwoord 6, autoriteit 2%

Het is om een tweede instructie uit te voeren als de eerste instructie succesvol eindigt. Like een if-statement:

if (1 == 1 && 2 == 2)
  echo "test;"

De eerste probeert als 1 == 1, als dat true is, controleert of 2 == 2


Antwoord 7, Autoriteit 2%

Zie het voorbeeld:

mkdir test && echo "Something" > test/file

Shell zal proberen directory testen vervolgens, alleen als het succesvol was zal proberen het bestand erin te maken.

, zodat u een sequentie van stappen onderbrekt als een van deze faalde.


Antwoord 8, Autoriteit 2%

command_1 && command_2: EXECUTE COMMAND_2 ALLEEN wanneer Command_1 met succes wordt uitgevoerd.

command_1 || command_2: EXECUTE COMMAND_2 Alleen wanneer Command_1 niet succesvol is.

voelt op vergelijkbaar als hoe een ‘als’ -voorwaarde wordt uitgevoerd in een mainstream-programmeertaal, zoals, in if (condition_1 && condition_2){...}condition_2 zal worden weggelaten als conditie_1 is falseen in if (condition_1 || condition_2){...}condition_2 zal worden weggelaten als condition_1 trueis.
Kijk, het is dezelfde truc die u gebruikt voor codering 🙂


Antwoord 9

####################### && or (Logical AND) ######################
first_command="1"
two_command="2"
if [[ ($first_command == 1) && ($two_command == 2)]];then
 echo "Equal"
fi

Wanneer het programma wordt gecontroleerd als het opdracht, maakt het programma een getal genaamd Exit-code, als beide voorwaarden waar zijn, de exitcode is nul (0), anders is de exitcode positief nummer. Alleen bij het weergeven van gelijk als de exitcode nul (0) wordt geproduceerd die betekent dat beide voorwaarden waar zijn.

Other episodes