Il semble y avoir beaucoup d'informations sur la façon d'éditer et d'exécuter une commande à l'aide de votre éditeur en utilisant "edit-and-execute-command (Cx Ce)", mais ce que j'aimerais réaliser, c'est prendre la commande shell actuelle, appliquer certains filtrages (à l'aide d'un script), puis le renvoyer pour demander une approbation / des modifications manuelles supplémentaires avant l'exécution. Est-ce possible avec bash?
13
edit-and-execute-command
.Escape
+V
, mais il va quand même exécuter la commande. Donc, pour la solution de contournement, j'ajouteraisecho
à l'avant pour l'exécuter en imprimant la commande sur la console pour examen.Réponses:
Dernière mise à jour sur mon expérience
La partie
0"+y$dd
de la cartographie suivante est vraiment quelque chose à laquelle vous devriez réfléchir attentivement et l'adapter à vos goûts / flux de travail / expérience.Par exemple, très souvent, je me suis retrouvé avec plusieurs lignes dans le tampon, où je veux seulement exécuter celle sur laquelle se trouve le curseur; dans ce cas, je peux utiliser à la
0"+y$dd:%d<CR>
place de0"+y$dd
.Et ce n'est là qu'un des scénarios possibles.
Réponse finale pour ceux qui aiment
vim
vim
comme votreEDITOR
/VISUAL
, afin que lors de la modification d'une ligne de commande, vous l'utilisiezvim
pour la modifier.au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
votre~/.vimrc
fichier à mapper Leaderd(que vous utiliserez rarement lors de l'édition d'une commande) à l'action "supprimer la ligne courante dans le+
registre sans la fin EOL".+
ou le*
registre dans le mappage ci-dessus; les façons de coller dans le terminal seront probablement différentes; vous avez besoin de l'+clipboard
option pour que ces registres soient disponibles .vim
éditeur, appuyez sur EscapeLeaderd.Réponse originale
J'ai souvent besoin de faire de même et je le fais comme suit. (J'utilise normalement le
set -o vi
inbash
, donc les points 1 et 2 suivants sont différents si vous utilisezset -o emacs
, la valeur par défaut; sur la base de votre question, il semble que les points 1 et 2 sont unifiés en Ctrl+ xsuivi de Ctrl+ e, ce qui est plus difficile à taper, à mon humble avis .)(C'est ici que vous posez la question.)
URxvt
.Il s'agit clairement d'une solution de contournement, consistant à copier la commande modifiée dans le presse-papiers avant de supprimer la commande entière, afin que rien ne soit exécuté à la sortie de l'éditeur; mais c'est le mieux que je puisse me procurer.
Mise à jour
Comme mon
EDITOR
(etVISUAL
) est égal àvim
, lorsque je modifie la commande, je la modifie dansvim
.À cet égard, j'ai remarqué que le tampon est nommé
/tmp/bash-fc.random
, où serandom
trouve une chaîne aléatoire alphanumérique à 6 caractères.Cela donne de l'espace à de nombreuses possibilités, si vous l'utilisez
vim
comme éditeur, car vous pouvez définir un mappage dans votre.vimrc
pour exécuter la séquence entière Escape0"+y$dd:wq. Par exemple, une commande que vous utiliseriez rarement lors de la modification d'une ligne de commande est Leaderd; vous pouvez donc mettre lemap
ping suivant dans votre.vimrc
fichierde sorte que l'étape 4 de la recette ci-dessus devienne
la source
Ce n'est pas possible de faire cela dans Bash / readline mais c'est possible dans zsh en utilisant la
edit-command-line
commande:Maintenant, appuyez sur Control- x Control- epour ouvrir votre éditeur, modifier la ligne, quitter l'éditeur - vous verrez la ligne de commande mise à jour mais elle ne sera pas exécutée automatiquement.
la source
Maintenant que j'y pense, peut-être qu'une variation de ce que @kenorb a suggéré dans un commentaire est la meilleure solution (car il semble qu'aucune solution n'existe), si nous voulons nous en tenir
bash
.Ce que vous pouvez faire, c'est ajouter un
#
(le caractère de commentaire dansbash
) à la commande, plutôt queecho
. Ensuite, lorsque vous quittez l'exitor, la commande sera inefficace, et vous n'aurez qu'à appuyer sur arrow up(ou k, si vous utilisezset -o vi
), supprimer le#
et confirmer.Notez que cette stratégie n'ajoute que quelques touches, elle peut donc être assez efficace, selon votre niveau de frappe.
la source
Ces pièces pourraient vous rapprocher:
a) remplacer la liaison normale pour la nouvelle ligne nouvelle ligne (ctrl-M)
bind -x '"\C-M":date"
b) saisir la ligne actuelle de l'historique en utilisant
!#
remplacez la date par le script que vous voulez.
c) éditer manuellement
d) si nécessaire, liez d'une manière ou d'une autre
!!:p
qui imprime la nouvelle commande à la ligne de commande mais ne l'exécute pas, vous permettant ainsi de la modifier manuellement.e) en utilisant ctrl-J soumettre la commande modifiée plutôt qu'une nouvelle ligne
ou ils pourraient ne pas ...
la source
Il y a une option dans bash pour modifier la commande de l'historique sans l'exécuter. Je ne suis pas sûr qu'il soit possible d'utiliser un script pour cela, cela ne semble pas probable. Cependant, vous pouvez apporter des modifications à l'aide des modificateurs d'historique.
Voici à quoi ça ressemble:
la source
Je voudrais vous indiquer le framework Composure pour Bash (je n'y suis pas affilié): https://github.com/erichs/composure
Il fournit
draft
etrevise
fonctions que le son comme ils pourraient aider à ce que vous essayez de faire. Voici une (longue) citation du fichier Lisez-moi du projet:la source
Cela ne semble pas possible avec un raccourci clavier, au moins:
la source