web-dev-qa-db-fra.com

Bash (ou n'importe quel shell, d'ailleurs) a-t-il un mode «écrasement»?

J'exécute des commandes similaires sur (par exemple) un ensemble de fichiers. Par exemple, disons que je fais quelque chose comme ceci (ce n'est pas ce que je fais, c'est juste un exemple):

> cat path/to/dir/file01.txt
  [file contents]
> another-command path/to/dir/file01.txt
  [more output]
> cat path2/to/dir/file02.txt
  [file contents, from which I can tell I should do something different]
> different-command path2/to/dir/file02.txt
  [yet more output]
> cat path3/to/dir/file03.txt
  [file contents]
> another-command path3/to/dir/file03.txt
  [output]

etc.

Ce serait pratique si, après avoir utilisé le  touche pour revenir à une commande précédente, je pourrais écraser le texte non dupliqué - comme le nom du fichier ou une partie commune du chemin - plutôt que de le supprimer et de le retaper.

Y a-t-il un moyen de faire cela?

4
Wilson F

Bash a cela, mais il n'est lié à aucune clé par défaut.

Ajouter la ligne

Control-o: overwrite-mode

à votre $HOME/.inputrc ou /etc/inputrc à utiliser Ctrl+o pour basculer entre le mode insertion et le mode substitution.

Voir la section READLINE de la page de manuel Bash pour plus d'informations.

3
Florian Diesch

Ce n'est pas ce que vous avez demandé directement, mais vous pouvez utiliser différentes formes de interaction avec l'historique pour simplifier votre tâche:

_$ cat path/to/dir/file01.txt
cat: path/to/dir/file01.txt: No such file or directory
$ different-command !$
different-command path/to/dir/file01.txt
bash: different-command: command not found
$ cat !$:s/1/2/
cat path/to/dir/file02.txt
cat: path/to/dir/file02.txt: No such file or directory
$ ^2^3
cat path/to/dir/file03.txt
cat: path/to/dir/file03.txt: No such file or directory
$ !-3:s/1/3/
different-command path/to/dir/file03.txt
bash: different-command: command not found
$ !diff:s/3/4/
different-command path/to/dir/file04.txt
bash: different-command: command not found
_

En ignorant les erreurs, chaque fois que j'utilisais une interaction d'historique (_!$_, _!$:s/1/2_, _^2^3_), vous pouvez voir comment bash l'a développée.

  • _!$_ - le dernier mot de la commande précédente
  • _:s/1/2_ - remplace la première occurrence de _1_ par _2_ dans le mot sélectionné (dans le cas présent, il s'agissait de _!$_.).
  • _^2^3_ - remplace la première occurrence de _2_ par _3_ dans toute la commande précédente.
  • _!-3_ - lance la troisième commande.
  • _!diff_ - lance la dernière commande qui a commencé avec diff.
5
muru

Vous pouvez lier une clé à une directive readline dans $HOME/.inputrc.

"code": overwrite-mode

Pour découvrir le code généré par une touche spécifique, appuyez sur CtrletV ensemble puis appuyez sur cette touche. Par exemple, lorsque vous appuyez sur la touche Ins (insérer), vous voyez ^[[2~. Attention, ^[ n'est que la représentation de l'écran pour ESC, qui est représentée par \e pour readline. Par conséquent, vous devez ajouter la ligne suivante à $HOME/.inputrc:

"\e[2~": overwrite-mode

et redémarrez bash.

4
colemar