Autant que je sache, utiliser &
après la commande permet de l'exécuter en arrière-plan.
Exemple d'utilisation de &
: tar -czf file.tar.gz dirname &
Mais qu'en est-il de &&
? (Regardez cet exemple: https://serverfault.com/questions/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188 )
&&
vous permet de faire quelque chose en fonction de la réussite de la commande précédente - c'est pourquoi vous avez tendance à la voir chaînée en tant que do_something && do_something_else_that_depended_on_something
.
De plus, vous avez également ||
qui est le ou logique, et aussi ;
qui est juste un séparateur qui ne tient pas compte de ce qui est arrivé à la commande auparavant.
$ 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
Quelques détails à ce sujet peuvent être trouvés ici Listes de commandes dans le manuel de Bash.
ligne de commande - quel est le but de
&&
?
Dans Shell, quand tu vois
$ command one && command two
l'intention est d'exécuter la commande qui suit le &&
que si la première commande est réussie. Ceci est idiomatique des coquilles Posix, et pas seulement dans Bash.
Il a l'intention d'empêcher l'exécution du deuxième processus si le premier échoue.
Les programmes renvoient un signal à la sortie. Ils doivent retourner 0 s'ils sortent avec succès, ou plus grand que zéro s'ils ne le font pas. Cela permet une quantité limitée de communication entre les processus.
Le &&
est appelé AND_IF
dans la grammaire posix shell , qui fait partie d'une and_or
liste de commandes, qui incluez également le ||
qui est un OR_IF
avec une sémantique similaire.
Symboles de grammaire:
%token AND_IF OR_IF DSEMI /* '&&' '||' ';;' */
Grammaire:
and_or : pipeline | and_or AND_IF linebreak pipeline | and_or OR_IF linebreak pipeline
Les deux opérateurs ont la même priorité et sont évalués de gauche à droite (ils sont de gauche associative). Par exemple, les éléments suivants:
$ false && echo foo || echo bar $ true || echo foo && echo bar
les deux ne font qu'écho bar
.
Dans le premier cas, la valeur false est une commande qui se termine avec le statut 1
$ false
$ echo $?
1
ce qui signifie echo foo
ne s'exécute pas (c'est-à-dire, court-circuitant echo foo
). Ensuite, la commande echo bar
est exécutée.
Dans le second cas, true se termine avec le code 0
$ true
$ echo $?
0
et donc echo foo
n'est pas exécuté, alors echo bar
est exécuté.
Un usage assez courant pour '&&' est la compilation de logiciels avec autotools. Par exemple:
./configure --prefix=/usr && make && Sudo make install
Fondamentalement, si la configuration réussit, make est exécuté pour la compilation et, si cela réussit, est exécuté en tant que root pour installer le programme. J'utilise ceci quand je suis surtout sûr que les choses vont fonctionner, et cela me permet de faire d'autres choses importantes comme regarder le stackoverflow et ne pas "surveiller" la progression.
Parfois, je suis vraiment emporté ...
tar xf package.tar.gz && ( cd package; ./configure && make && Sudo make install ) && rm package -rf
Je fais cela quand, par exemple, faire un Linux à partir de zéro.
&&
chaîne des commandes ensemble. Les commandes successives ne sont exécutées que si les précédentes réussissent.
De même, ||
permettra l'exécution de la commande suivante si la précédente échoue.
Voir Programmation Shell Bash .
Voir l'exemple:
mkdir test && echo "Something" > test/file
Shell essaiera de créer le répertoire test
puis, niquement s’il a réussi essaie de créer un fichier à l’intérieur.
Vous pouvez donc interrompre une séquence d'étapes si l'une d'entre elles a échoué.
command_1 && command_2
: exécute la commande_2 uniquement lorsque la commande_1 est exécutée avec succès.
command_1 || command_2
: exécute la commande_2 uniquement lorsque la commande_1 n'a pas été exécutée avec succès.
Ressemble à la façon dont une condition 'if' est exécutée dans un langage de programmation traditionnel, comme dans if (condition_1 && condition_2){...}
la condition_2 sera omise si la condition_1 est false
et dans if (condition_1 || condition_2){...}
la condition_2 sera omise si la condition_1 est true
. Vous voyez, c'est le même truc que vous utilisez pour le codage :)
C'est pour exécuter une deuxième instruction si la première instruction se termine avec succès. Comme une déclaration if:
if (1 == 1 && 2 == 2)
echo "test;"
Son premier essai si 1 == 1, si c'est vrai, il vérifie si 2 == 2