Syntaxe de Linux Bash: Signification de &&, \ et -

14

Que signifient les « &&», « \» et « -» à la fin des commandes bash?

En particulier, je suis tombé sur la combinaison suivante de lignes qui sont censées ajouter des clés publiques au gestionnaire de paquets aptitude d'Ubuntu, à quoi servent ces caractères ici?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key add - && \
    mise à jour sudo apt-get
Alex
la source
"/" n'est pas la même chose que "\"
Thomas
Thomas: correction de son message
Kyle Brandt
Les barres obliques inverses ici ne sont pas nécessaires car le && suffira également pour impliquer la poursuite de la ligne. Cependant, l'utilisation de la barre oblique inverse facilite la lisibilité.
pause jusqu'à nouvel ordre.

Réponses:

37

"&&" est utilisé pour chaîner des commandes, de sorte que la commande suivante est exécutée si et seulement si la commande précédente s'est terminée sans erreur (ou, plus précisément, se termine avec un code retour de 0).

"\" à lui seul à la fin d'une ligne est un moyen de concaténer des lignes ensemble. Donc, les deux lignes suivantes:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075

sont traités exactement de la même manière que si la ligne était écrite comme une seule ligne:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && gpg --export --armor 26C2E075

"-" est un argument de ligne de commande sans fonction bash spécifique. La manière exacte dont il est géré dépend de la commande exécutée (dans ce cas, apt-key ). Selon le contexte, il est généralement utilisé pour indiquer « lire les données de stdin plutôt que d'un fichier » ou « traiter le reste de la ligne en tant que données plutôt qu'en tant qu'arguments de ligne de commande ».

goldPseudo
la source
5
Dans ce cas, «-» n'est pas un paramètre de sudo mais de «apt-key», ce qui signifie qu'au lieu d'un fichier de clés, «apt-key» utilise les données provenant du canal («|») vers son stdin comme clé. L'option "gpg --export", sans avoir '--output a_file_name.key', pousse une nouvelle clé hors de la sortie standard gpg, à travers le tube ('|') jusqu'à la stdin de 'apt-key' Facile: - )
edomaur
2
whoops. c'est ce que j'obtiens pour répondre aux questions pendant mon sommeil. fixé.
goldPseudo
7
&& == if the first command succeeded, run the next one
\ == the next line is part of the first line, not two seperate lines
- == read the input from stdin (console)
rodjek
la source
6

&& est le ET logique:
&& est un moyen d'exprimer le ET logique , ce qui signifie que l'expression entière n'est vraie que si ses deux côtés sont vrais. En logique, on dit que la déclaration entière (P&Q) n'est vraie que lorsque P et Q sont vrais.

En conséquence, les ordinateurs traitent généralement P&Q comme une évaluation de court-circuit . Donc, puisque la déclaration entière ne sera vraie que si P et Q sont tous deux vrais, alors si P est faux, la déclaration Q n'est pas évaluée . Fondamentalement, les ordinateurs sont paresseux (efficaces) et ne prennent pas la peine d'évaluer Q s'ils n'en ont pas trop. Cela vaut également pour OU logique, voir le lien précédent.

Les trois contextes de && dans Bash:

1) Utilisation de l'évaluation des courts-circuits avec l'état de sortie d'une commande:
chaque commande a un état de sortie. Si une commande contient une erreur, son état de sortie est différent de zéro. Donc, si l'état de sortie est différent de zéro et que && est utilisé pour enchaîner les commandes dans une instruction, les commandes ultérieures ne seront pas évaluées (exécutées) si la précédente n'avait pas l'état de sortie 0 (Vrai). Cela est dû à l'évaluation des courts-circuits. Donc si vous avez:

P && Q

Q ne sera pas exécuté si P n'était pas vrai (si P sort avec un statut différent de 0, ce n'est pas vrai). Tout comme:

./configure && make

make ne sera pas exécuté si configure avait une erreur, n'était pas vrai. Donc, en gros, cela finit par être un moyen d'écrire la déclaration if then:

if ./configure ; then
   make
fi

Gardez à l'esprit que dans la plupart des contextes, 0 est faux, mais pas lorsqu'il s'agit d'un statut de sortie.

2) && Peut être utilisé dans la commande de test [[]] intégrée de Bash:

&& Peut également être utilisé à l'intérieur de la commande de test intégrée dans bash [[]] pour combiner des expressions d'une manière similaire à la combinaison de commandes. L'opération de test entière ne sera vraie que si les deux opérandes (côtés) de && sont vrais, par exemple:

if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ... 

serait une façon de dire si $ a est un entier compris entre 2 et 5 (hors 2 et 5).

3) Évaluation arithmétique:

Enfin, && peut être utilisé dans l'évaluation arithmétique comme ET logique. Si les deux (ET logique) des nombres suivants sont différents de zéro, il renvoie 0, sinon 1 est renvoyé:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0
Kyle Brandt
la source
@Kyle: && utilisé en dehors d'une expression logique est "l'opérateur de contrôle AND", comportement similaire mais techniquement différent
drAlberT
Ne suivez pas votre commentaire, que voulez-vous dire en dehors d'une expression logique?
Kyle Brandt
Je veux dire que dans une expression, l'opérateur de contrôle && suppose la moyenne de "logique et", sinon ce n'est qu'un "et". Il s'agit de "l'opérateur de contrôle AND", utilisé dans les listes. les opérateurs logiques sont utilisés dans le contexte de l'expansion arithmétique, au sein des expressions.
drAlberT
dans l' if [./configure]exemple, vous devez supprimer les crochets. Le correct estif ./configure; then make...
Juliano
Juliano, Good catch, mettra à jour. AlberT, y a-t-il une différence autre que les termes que les pages de manuel lui donnent?
Kyle Brandt
3

Je pense que vous irez mieux avec une explication de la "vraie" signification, les implications sont une autre chose :)

  • && est l'opérateur de contrôle "AND". De l' homme bash :
    Les opérateurs de contrôle && et || désignent respectivement les listes ET et les listes OU.
    Une liste ET a la forme  
        command1 && command2     
    command2 est exécutée si, et seulement si, command1 renvoie un état de sortie de zéro.
    [..Couper..]
    L'état de retour des listes ET et OU est l'état de sortie de la dernière commande
    exécuté dans la liste.
    
    Un opérateur de contrôle est
    Un jeton qui exécute une fonction de contrôle. Il s'agit de l'un des symboles suivants:
        || & &&; ;; () |
    
  • \est le " caractère d'échappement ", et c'est l'un des trois mécanismes de citation disponibles dans bash:
    CITATION
       La citation est utilisée pour supprimer la signification spéciale de certains caractères ou mots dans le shell.
    [..Couper..]
       Il existe trois mécanismes de citation: le caractère d'échappement, les guillemets simples et les guillemets doubles.
       Une barre oblique inverse entre guillemets (\) est le caractère d'échappement. Il conserve la valeur littérale du caractère suivant qui suit, à l'exception de. Si une paire \ apparaît et que la barre oblique inverse n'est pas elle-même citée, le \ est traité comme une continuation de ligne (c'est-à-dire qu'il est supprimé du flux d'entrée et effectivement ignoré).
    [..Couper..]
    La barre oblique inversée conserve sa signification spéciale uniquement lorsqu'elle est suivie par l'un des caractères suivants: $, `,", \ ou.
    
    Cela signifie que si vous mettez un caractère d'échappement (le "\") à la toute fin d'une ligne, vous échappez en fait au nouveau caractère de ligne qui le suit immédiatement (le caractère RETOUR), ce qui a pour effet de "continuer la ligne" d'autres l'ont déjà expliqué dans leur réponse
  • Le caractère de tiret " - " que certaines commandes acceptent comme paramètre est une convention, pas un caractère ou un opérateur spécial shell. Comme d'autres l'ont déjà souligné, c'est une sorte de marqueur de position pour les flux d'E / S standard. Selon le programme auquel nous nous référons, il peut rester pour stdin (l'entrée standard) ou stdout (la sortie standard).

Mes 2 cents

drAlberT
la source
1
Ça va probablement être un cas de tl; dr. Coller des morceaux géants d'une page de manuel - aussi éclairant soit-il - ne fera qu'intimider le PO.
rodjek