web-dev-qa-db-fra.com

Rechercher une commande précédente avec le préfixe que je viens de taper

Nous pouvons utiliser les flèches haut et bas pour naviguer dans l'historique des commandes.

Dans certains IDE, tels que Matlab, si nous saisissons quelque chose puis appuyons sur les touches fléchées, nous faisons défiler uniquement les commandes d'historique en commençant par ce que nous avons entré. C'est vraiment pratique, mais dans un terminal Shell, cela ne fonctionne pas.

Existe-t-il un moyen d'obtenir une fonction similaire dans un terminal Shell? Et d'autres conseils pour améliorer l'efficacité de l'utilisation des terminaux?

74
Lee

Ce que vous cherchez c'est CtrlR.

Type CtrlR puis tapez une partie de la commande souhaitée. Bash affichera la première commande correspondante. Continuez à taper CtrlR et bash fera défiler les commandes de correspondance précédentes.

Pour rechercher en arrière dans l'historique, tapez CtrlS au lieu. (Si CtrlS ne fonctionne pas de cette façon pour vous, cela signifie probablement que vous devez désactiver le contrôle de flux XON/XOFF: pour ce faire, exécutez stty -ixon.)

Ceci est documenté sous "Recherche" dans man bash.

109
John1024

Placez-les dans votre ~/.inputrc:

"\e[5~": history-search-backward
"\e[6~": history-search-forward

Cela fait Page Up et Page Down comportez-vous comme vous le souhaitez. (Certaines distributions l'ont déjà configuré pour vous.) Personnellement, je trouve cela plus pratique que Ctrl+R ou history.

33
egmont

Outre l'historique de ^ r/^ s, je recherche:

alt. insère le dernier "Word" de la commande précédente au niveau du curseur. Répétez-le pour obtenir le dernier mot des anciennes commandes. (Mais notez qu'un & De fin compte comme le dernier mot pour les commandes d'arrière-plan).

C'est super pratique pour mkdir foo, cd alt-dot. Encore plus rapide que la flèche vers le haut, ^ a, alt-d (supprimer le mot vers l'avant), cd.

Pour obtenir l'avant-dernier mot, utilisez esc-2alt+. (C'est-à-dire utilisez un argument numérique de style emacs pour alt+.. Les décomptes négatifs à partir de la fin, les décomptes positifs à partir du début.) Mais c'est généralement plus de problèmes que cela ne vaut; à un moment donné, il est plus rapide d'atteindre la souris et de copier/coller, ou la flèche vers le haut et ^ w/^ y une partie (voir ci-dessous).


Si votre terminal est bien configuré/correctement, ctrl-gauche et ctrl-droite iront en arrière/en avant par des mots. Sinon, j'espère qu'au moins alt-b et alt-f feront la même chose.


ctrl-/est une annulation. Vous pouvez utiliser la répétition automatique pour supprimer des mots beaucoup plus efficacement si vous pouvez annuler lorsque vous dépassez un peu.


Un mixage/correspondance des commandes plus puissant provient de l'utilisation du kill-ring, qui fonctionne exactement comme dans Emacs. ctrl-y pour coller le dernier ctrl-w/ctrl-u/ctrl-backspace/alt-d. alt-y pour parcourir les anciens textes supprimés.

Plusieurs touches Ctrl-w ou quoi que ce soit d'affilée font sur l'entrée kill-ring. Utilisez les flèches gauche et droite ou quelque chose pour briser l'entrée si vous souhaitez supprimer deux éléments et n'en coller qu'un plus tard.

En combinant tous ces éléments, vous pouvez

  • commencez à taper une commande
  • ctrl-r pour revenir à une ancienne commande et en récupérer une partie avec control-w ou similaire.
  • esc-r ou alt+r pour le restaurer tel qu'il était avant d'en supprimer une partie.
  • alt - > pour aller à la fin de l'historique (c'est-à-dire la flèche vers le bas jusqu'au bout), pour revenir à la commande dont vous étiez au milieu.

Autres conseils d'utilisation interactive:

Activez shopt -s globstar, Vous pouvez donc faire **/*.c (Récursif incluant le répertoire courant). Parfois pratique pour une utilisation interactive, mais généralement find -name '*.c' -exec foo {} + Est préférable.

Si vous écrivez des scripts bash, vous trouverez pratique d'avoir également activé shopt -s extglob Dans vos shells interactifs. Vous trouverez parfois une utilisation pour des choses comme *.!(c|h) pour faire correspondre des fichiers qui ne se terminent pas par .c ou .h.

Trouvez les alias que vous aimez pour ls -l, less, et tout ce que vous faites beaucoup. (cp -i, mv -i Et rm -I Sont sympas. Ne prenez pas l'habitude de selon sur eux pour faire un rm sélectif. GNU rm -I demande une fois tous les arguments.)

J'aime alias m=less (M pour "plus"). J'ai less configuré avec , et . lié au fichier précédent/suivant (lesskey). La valeur par défaut est une séquence à touches multiples qui ne peut pas être utilisée avec la répétition automatique.


J'aime tout faire à l'intérieur de l'écran GNU. Je trouve plus facile de garder une trace des fenêtres d'écran numérotées qu'une cargaison d'onglets dans Konsole (ou tout autre émulateur de terminal que j'ai essayé). Si vous ne connaissez pas déjà screen, apprenez tmux car il est plus récent et moins cruel.

Pour obtenir quelque chose comme la fonctionnalité d'ouvrir un nouveau Shell avec le même cwd qu'un autre Shell, j'utilise n crochet personnalisé pour cd/pushd/popd qui me permet de faire cds 8 Pour cd dans n'importe quel répertoire de mon Shell dans la fenêtre d'écran 8 utilise. Cela fonctionne même pour les shells en dehors de la session d'écran, tant qu'il n'y a qu'une seule session d'écran.

10
Peter Cordes

Ajoutez les lignes suivantes à votre ~/.inputrc

"\e[A": history-search-backward
"\e[B": history-search-forward

Ceci est similaire à la réponse d'Egmont, mais au lieu d'utiliser Page Haut et Page Bas, il utilise les séquences d'échappement pour Flèche Haut et Flèche Bas. Cette méthode est beaucoup plus pratique à utiliser sur un Mac.

7
John Slavick

J'ai toujours tendance à configurer mes machines avec une grande valeur HISTSIZE afin qu'elle conserve une liste d'historique plus longue, ainsi que HISTTIMEFORMAT avec la valeur d'horodatage pour que je puisse voir quand la commande a été exécutée.

export HISTSIZE=10000
export HISTTIMEFORMAT="%m/%d/%Y %T "
5
Alpha01

Le moyen que j'utilise habituellement est de combiner la commande history avec grep

C'EST À DIRE:

history | grep <command im looking for>

Cela affichera un historique numéroté des commandes que vous avez tapées qui contiennent cette commande, vous pouvez ensuite utiliser:

!<number listed in history command>

pour refaire cette commande.

C'EST À DIRE:

history | grep history

142  history
143  history | grep lvresize
568  history | grep echo
570  history | grep echo
571  history | grep history

suivi par: !571

va répéter history | grep history

3
Gravy

Si vous pouvez utiliser zsh au lieu de bash, vous pouvez utiliser oh-mi-zsh pour cela.

Vous pouvez parcourir l'historique de vos commandes avec les flèches haut et bas. Il permet également la même navigation lorsque vous avez déjà tapé le texte (comme dans Mathlab).

edit: Oh-my-zsh est un grand progiciel orienté développeur qui comprend de nombreuses autres fonctionnalités, par ex. alias, thèmes, plugins. Ces extras rendent la distribution plus complexe à utiliser qu'un raccourci clavier.

https://github.com/robbyrussell/oh-my-zsh

2
user9869932

J'ai utilisé quotidiennement 4 astuces (et quelques autres) dans mon terminal bash:

  • Exécuter la dernière commande:!!

  • Exécuter la commande [~ # ~] n [~ # ~] à partir de l'historique:!N

  • Imprimer la dernière commande commençant par préfixe à partir de l'historique:!prefix:p

  • Exécute la dernière commande commençant par préfixe à partir de l'historique:!prefix

2
Nolwennig

Ajoutez l'alias suivant à ~/.bashrc

alias h='history | awk '"'"'{$1="";print}'"'"' |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep'

Utilisation: h fire me donnera une liste de commandes contenant fire. ou h ^fire me donnera une liste de commandes commençant par fire.

Ceci est utile lorsque je souhaite afficher une série de commandes en même temps.

Au fait, '"'"' est moche mais je n'ai pas pu trouver d'autres moyens d'éviter les guillemets simples entre guillemets simples.

1
Hosi Golden