Pourquoi suis-je parfois invité à plusieurs reprises avec «>» dans le terminal?


19

D'accord, lorsque j'exécute certaines commandes dans le mauvais sens, (mal orthographié, etc.) Le terminal affiche ceci: >au lieu de computername:workingfolder username$, et quand je tape enter, il se présente comme ceci:

>

>

>

Ce serait si j'appuyais sur Entrée 3 fois.

Réponses:


43

> est l'invite de continuation par défaut. C'est ce que vous verrez si ce que vous avez entré avant avait des guillemets asymétriques.

Par exemple, tapez un guillemet simple sur la ligne de commande suivi de quelques entertouches:

$ '
> 
> 
> 

Les invites de continuation se produiront jusqu'à ce que vous

  • (a) terminer la commande avec un guillemet de fermeture

    ou

  • (b) tapez Ctrl+ Dpour terminer la saisie, à quel point le shell répondra avec un message d'erreur sur les guillemets non équilibrés,

    ou

  • (c) tapez Ctrl+ Cqui annulera la commande que vous avez entrée.

Utilité

Parfois, vous souhaiterez peut-être entrer une chaîne qui contient de nouvelles lignes incorporées. Vous pouvez le faire comme suit:

$ paragraph='first line
> second line
> third line
> end'

Maintenant, lorsque nous affichons cette variable shell, vous pouvez voir que les invites ont disparu mais que les retours à la ligne sont conservés:

$ echo "$paragraph"
first line
second line
third line
end

16

Cela se produira si vous avez un devis non divulgué dans votre commande. C'est quelque chose comme:

$ echo "test here
>
>
...

Vous pouvez quitter ce mode en fermant le devis (écrivez un "ou ', ou quel que soit votre devis ouvert). Il peut aussi être un bloc d'entretoise délimité, un partiellement complètes for-doou while-doboucle, ou certaines autres constructions. Vous pouvez également appuyer sur Ctrl-Cpour annuler cette commande (puis sur Uppour la réviser).

Cela peut parfois se produire sans une citation manquante évidente lorsque des extensions de paramètres ou d' historique se produisent là où vous ne les attendiez pas.


C'est >votre PS2("invite secondaire"). Vous pouvez changer cela pour autre chose pour vous rappeler ce qui s'est passé:

PS2="Unclosed >"

dans votre .bashrc, faites-le plutôt imprimer Unclosed >au début de chaque ligne.


7

En plus des autres réponses, vous obtenez également l'invite de continuation lorsque vous tapez a \comme dernier caractère d'une ligne.


5
(Pour moi, cela se produit généralement par accident, car la barre oblique inverse est terriblement proche de la touche Entrée.)
M. Lister

Pas sur mon clavier , ça ne l'est pas.
TRiG

@TRiG Vous voulez dire que vous tapez souvent # par accident au lieu de \? Droite ...
M. Lister

7

La réponse réside dans cette mention cryptique dans le manuel de référence Bash :

5.1 Variables du shell Bourne

[...]

  • PS1: La chaîne d'invite principale. La valeur par défaut est ' \s-\v\$'. Voir Impression d'une invite , pour la liste complète des séquences d'échappement qui sont développées avant PS1s'affiche.
  • PS2: La chaîne d'invite secondaire. La valeur par défaut est ' >'.

Suivi de :

6.3.3 Comportement interactif du shell

  1. Bash se développe et s'affiche PS1avant de lire la première ligne d'une commande, et se développe et s'affiche PS2avant de lire la deuxième ligne et les lignes suivantes d'une commande multiligne.

Ainsi, l' >invite apparaît si vous appuyez sur Enteret Bash détermine que la commande est incomplète. Cela pourrait être dû au fait que:

  • Le caractère précédant la nouvelle ligne est un \, qui est traité comme une continuation de ligne .
  • Vous avez une chaîne incomplète (guillemets Discordance ou unterminated ici-doc) ou d'autres délimiteurs dépareillées, comme $(), (), ``.
  • Vous avez démarré une définition de fonction, une forboucle, une whileboucle ou un case.

Si vous voyez l'invite secondaire en raison d'une erreur de frappe involontaire, appuyez sur ControlCpour revenir à l'invite principale.


Vous obtenez également l'invite secondaire lorsque vous saisissez un document ici. Mais cela est moins susceptible de se produire par accident que les autres.
Barmar

6

Le shell vous attend pour terminer la commande. Il y a peut-être une citation non fermée quelque part ou il pense que vous commencez une boucle "pour" et attend que l'utilisateur ait fini de taper

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.