Le terminal affiche> après avoir entré \

Réponses:

35

Chaque fois que vous utilisez la ligne de commande, il peut y avoir une instance lorsque vous devez exécuter une commande très longue. Vous souhaitez donc diviser la commande en plusieurs lignes pour une meilleure lisibilité et compréhension. Mais si vous utilisez un nouveau caractère de ligne qui est tapé par Enter, le shell pensera qu'il s'agit d'une nouvelle commande. Vous utilisez donc \suivi du caractère de nouvelle ligne.

Fondamentalement, les commandes ou scripts bash sont "interprétés", c'est-à-dire exécutés ligne par ligne. Chaque nouvelle ligne signifie le début d'une nouvelle commande. Dans le terminal, lorsque vous appuyez sur Enter, vous obtenez une invite pour exécuter une nouvelle commande. Ainsi, une nouvelle ligne doit être "échappée". La frappe \suivie de Entervous permet de diviser la commande en cours en plusieurs lignes afin que le shell ne pense pas que c'est une nouvelle commande mais la continuation de la commande précédente.

> n'est rien d'autre qu'une invite pour la ligne suivante de la commande entrée.

Par exemple:
si nous voulons installer plusieurs packages, la commande sera comme

$ sudo apt install [package1] [package2] [package3] ...

Mais parfois, cela rend la commande encombrée. Nous pouvons donc utiliser \suivi de Enter(caractère de nouvelle ligne)

$ sudo apt install [package1]\
> [package2]\
> [package3]\
> ...
Kulfy
la source
4
@Curiouskangaroo BTW, vous pouvez contrôler le fonctionnement des nouvelles invites de commande et de continuation de ligne , en définissant des valeurs pour les variables $PS1et $PS2. Reportez-vous à la page de manuel bash pour connaître le format et utilisez-la echo "'$PS2'"pour afficher le paramètre actuel.
jpaugh
14

Le caractère barre oblique inverse ( \) est utilisé comme caractère d'échappement dans le shell. Si vous l'utilisez comme dernier caractère de la ligne, il échappe à la nouvelle ligne, vous pouvez donc continuer votre commande sur la ligne suivante au lieu de la terminer. Ceci est indiqué par l' >invite dans Bash.

Exemple:

$ echo A\
> B
AB
$

Pour mettre un littéral \à votre commande, vous devez l'échapper en utilisant une autre barre oblique inverse:

$ echo \\
\
$
Melebius
la source
7

[ajouter une réponse (trop longue / complexe) car les 2 autres ne mentionnent pas comment le ">" apparaît ... c'est à dire, ne mentionnez pas PS2]

Vous avez tapé:: \Enterle \dit au shell pour simplement sortir le en Entertant que caractère literral au lieu de l' interpréter comme d'habitude (Par conséquent, le shell "va à la ligne suivante" au lieu de terminer la ligne de commande actuelle et de l'interpréter. Sauf si vous êtes dans certains d'autres constructions telles qu'un heredoc, une boucle for, etc.).

Votre terminal interprète donc \Entercomme: "aller à la ligne suivante" (sans commencer à interpréter la commande) et donc le terminal vous laisse maintenant entrer la 2ème ligne d'une commande multiligne, et pour la rendre plus visible affiche le $PS2contenu ( appelé l' invite PS2 ) sur chaque ligne suivante.

La variable PS2 est généralement définie par défaut comme: PS2="> "et vous pouvez par exemple éditer votre ~ / .bashrc pour la redéfinir comme vous le souhaitez (en tenant compte du fait qu'elle devrait, imo, éviter de contenir des caractères dangereux, tels que >ou ;, et devrait vous aider soit voir clairement est une commande multilignes mais désactiver son contenu multiligne (ex: PS2="#cont#") ou vous laisser copier facilement / les coller avec aussi peu d' impact sur ses lignes que possible (ex: PS2=" ")

Ce qui, en passant, est imo un mauvais défaut, car il pourrait très bien conduire à supprimer certaines commandes binaires importantes dans certains cas.

Vous pouvez redéfinir PS2 pour être autre chose (j'aime: PS2 = "", par exemple) afin que les commandes multilignes puissent être facilement copiées / collées sans craindre ce qui suit:

Par exemple, disons que vous avez une commande qui commence à être assez longue (et peut se replier sur votre écran si votre terminal n'est pas assez large):

grep -i "something"  /some/file  /another/file /3rd/file /etc/someimportantfile 

Si la commande semble trop longue (et s'enroule), vous pouvez la diviser visuellement en 2 lignes, en choisissant où (quand) vous voulez à la ligne suivante en insérant: \Enterà l'endroit approprié:

grep -i "something"  /some/file  /another/file /3rd/file \
> /etc/someimportantfile #warning, "> " was inserted by the shell and this changes everything !

En utilisant la PS2 par défaut, le shell a ajouté ">" avant "/ etc / someimportantfile" .. donc si vous copiez / collez ces 2 lignes dans un autre terminal, leur action sera complètement différente: au lieu de grepper dans 4 fichiers, le grep est entrer uniquement dans les 3 premiers fichiers, et la sortie grep remplace le contenu du 4ème fichier (/ etc / someimportantfile)!

Pour éviter ces problèmes (et bien d'autres): vous pourriez par exemple définir: PS2=" "pour rendre les commandes multi-lignes plus propres et plus faciles à copier / coller:

grep -i "something"  /some/file  /another/file /3rd/file \
  /etc/someimportantfile #now only 2 spaces were inserted, without changing the grep's actions!

Notez que cette fois / bin / somecommand est simplement décalée de 2 espaces vers la droite, et qu'aucun ">" n'a été inséré, vous pouvez donc copier / coller en toute sécurité cette commande sur 2 lignes.

PS2 est également utilisé dans les boucles "for" "tandis que" etc, et le définir comme "" est, pour moi, meilleur dans celles-là aussi.

Olivier Dulac
la source