Comment puis-je modifier les lignes précédentes dans une commande à plusieurs lignes dans Bash?

24

Lorsque vous entrez une commande qui s'étend sur plusieurs lignes dans Bash, comment puis-je modifier les lignes précédentes? Je suis un utilisateur de Linux Mint (Lisa) utilisant GNOME Terminal.

Par exemple, disons que je tape:

$ echo "foo bar
> baz
>

Et puis quand je suis sur le point de taper la troisième ligne de la commande, réalisez soudain que je veux que "foo" et "bar" soient sur des lignes séparées. Comment pourrais-je repositionner mon curseur entre "foo" et "bar" de telle sorte que je puisse appuyer sur Entrée et les mettre sur des lignes séparées?

(Ce n'est pas facile comme vous pourriez le penser. La flèche vers le haut ne fonctionne pas, pas plus que Ctrl-P. Alors s'il vous plaît, essayez-le avant de poster! Merci!)

Asher Walther
la source
La réponse acceptée dit qu'il n'y a pas de solution, mais c'est le cas. Voir ci
cdosborn

Réponses:

16

Malheureusement, cela ne dépend bashpas du terminal. Vos options sont:

  1. Utilisez des points-virgules au lieu des sauts de ligne, même si vous ne pouvez pas remonter une ligne d'écran à la fois mais devez utiliser des commandes de mouvement de caractères ou de mots. (Curieusement, zshau moins vous permet de vous déplacer dans une commande composée lors de la modification de l'historique, mais pas dans la commande actuelle .) Parfois fc(qui vous lance dans votre éditeur avec la commande précédente) est le moyen le plus simple de gérer les commandes composées.

  2. Si vous utilisez Bash, utilisez la combinaison de touches suivante:

    ctrl x e

    Il ouvrira la commande sur laquelle vous travaillez en utilisant votre éditeur de texte. Enregistrez le fichier et quittez. (J'ai trouvé la commande sur la présentation de Shell Hater .) Les utilisateurs de Zsh ont cette alternative .

geekosaure
la source
1
La page de manuel bash explique comment changer l'éditeur utilisé: commande d'édition et d'exécution (C-xC-e) - Appelle un éditeur sur la ligne de commande actuelle et exécute le résultat sous forme de commandes shell. Bash tente d'appeler $ VISUAL, $ EDITOR et emacs en tant qu'éditeur, dans cet ordre.
Matthew
Il existe une solution, sans ouvrir l'éditeur.
cdosborn
Techniquement, ce n'est pas à la hauteur de bash - mais à la bibliothèque "readline" que bash utilise pour obtenir des entrées.
Christian Herenz
11

La solution est de ne jamais entrer de commande tant que la multiligne n'est pas correcte, il suffit de taper: CtrlvCtrlj quand vous voulez passer à la ligne suivante. Metabrevenir en arrière.

Solution

crédit à la réponse de @ rici

cdosborn
la source
4

Curieusement, Ctrl+Cc'est ce que vous recherchez.

quand tu es

$ echo "foo bar
> baz
>

appuyez simplement sur Ctrl+C(la ligne de commande modifiée sera suspendue) et appuyez sur Up(historique précédent). Votre invite sera: (notez l'absence de>)

$ echo "foo bar
baz

Vous pouvez maintenant vous déplacer avec des Left Rightsauts de ligne réguliers.

Il n'y a qu'une bizarrerie, vous devez être sur le dernier caractère pour ajouter une autre ligne, alors déplacez-vous pour éditer les lignes existantes (allez pour commencer Ctrl+A) une presse Enter si cela suffit ou allez à la fin ( Ctrl+E) pour ajouter plus de lignes avec Enter. Un autre inconvénient est que Ctrl+_(annuler) ne restaure que les modifications de la dernièreCtrl+C

albfan
la source
-2

Copiez les commandes et collez-les dans le bloc-notes, puis formatez-les à partir de là. Après cela, vous pouvez recopier vos commandes sur le terminal.

Pacheko
la source