Recherchez 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 lhistorique des commandes.

Dans certains IDE, tels que Matlab, si nous entrons quelque chose puis appuyons sur les touches fléchées, nous faisons défiler uniquement les commandes dhistorique en commençant par ce que nous avons dentrée. Cest vraiment pratique, mais dans un terminal shell, cela ne fonctionne pas.

Y a-t-il un moyen dobtenir une fonction similaire dans un terminal shell? Et dautres conseils pour améliorer lefficacité de lutilisation du terminal?

Commentaires

  • Vous pouvez simplement utiliser un shell qui fournit une telle fonctionnalité, comme fish😉
  • @yoann vous ‘ en supposant que bash ne ‘ t . Il ne le fait, via readline, tout simplement pas accessible par défaut.
  • @muru Je ‘ suis conscient de CTRL + R dans bash, et egmont fournit une manière intéressante de le faire avec Page Up / Page Down. Y a-t-il cependant un moyen de le faire avec les touches fléchées?
  • @yoann check out unix.stackexchange.com/a/76591/70524. Au lieu de \e[5~ et \e[6~, utilisez \e[A, \e[B.

Réponse

Ce que vous recherchez, cest Ctrl R .

Tapez Ctrl R , puis tapez une partie de la commande souhaitée. Bash affichera la première commande correspondante. Continuez à taper Ctrl R et bash passera en revue les commandes correspondantes précédentes.

Pour rechercher en arrière dans lhistorique, tapez Ctrl S à la place. (Si Ctrl S 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.

Commentaires

  • Ctrl-Q pour quitter létat gelé, si vous avez déjà atteint Ctrl-S sans désactiver dabord le contrôle de flux et votre terminal a été gelé.

Réponse

Placez-les dans votre ~/.inputrc:

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

Cela fait Page précédente et Page suivante se comportent comme vous le souhaitez. (Certaines distributions lont déjà configuré pour vous.) Personnellement, je trouve cela beaucoup plus pratique que Ctrl + R ou history.

Commentaires

  • Cest le moyen le plus pratique dans toutes les réponses actuelles. U plz donne un peu explication sur le mécanisme de travail?
  • ~/.inputrc ou /etc/inputrc ou le fichier référencé par la variable denvironnement $INPUTRC est le fichier de configuration dédition de ligne de toutes les applications utilisant readline, y compris bash (votre shell). Il a certaines capacités dédition de ligne intégrées, y compris ces deux: dans la page de manuel de bash ‘, recherchez lun de ces mots-clés pour en savoir plus. \e[5~ / \e[6~ sont les séquences déchappement générées par les touches Page Up / Down dans la plupart des émulateurs de terminal; pour le voir, lancez la commande cat puis appuyez sur ces touches (loctet déchappement est représenté dans le terminal comme ^[, dans inputrc comme \e).
  • Lexemple de votre question dorigine indique que les touches Haut / Bas fonctionnent de cette façon dans Matlab. Il serait intéressant de voir ce qui se passe si vous placez la séquence Up et Down dans inputrc et assignez à cette action; fonctionnerait-il correctement, ou aurait-il des effets secondaires désagréables car il entre en conflit avec leur comportement par défaut. Je ne ‘ ne sais pas, je ‘ serais heureux dentendre vos résultats si vous expérimentez avec cela.
  • Quand je fais echo $INPUTRC, il est vide. Je ‘ utilise Ubuntu 14.04
  • Je préfère personnellement remplacer les flèches haut et bas pour faire ceci: "\e[A": history-search-backward et "\e[B": history-search-forward

Réponse

Outre lhistorique de ^ r / ^ i -search:

alt . insère le dernier « mot » de la commande précédente au niveau du curseur. Répétez-le pour obtenir le dernier mot des anciennes commandes. (Mais notez quun & final compte comme le dernier mot pour les commandes darrière-plan).

Cest très pratique pour mkdir foo, cd alt-dot. Encore plus rapide que la flèche vers le haut, ^ a, alt-d (supprimer le mot suivant), cd.

Pour obtenir le deuxième au dernier mot, utilisez esc - 2 alt+. (cest-à-dire utilisez un argument numérique de style emacs pour alt+..Les comptes négatifs à partir de la fin, les comptes positifs en avant depuis le début.) Mais cest généralement plus de problèmes que cela ne vaut la peine; à un moment donné, il est plus rapide datteindre la souris et de copier / coller, ou de flèche vers le haut et ^ avec une partie de celui-ci (voir ci-dessous).


Si votre terminal est bien / correctement configuré, ctrl-gauche et ctrl-droite iront en arrière / en avant par mots. Sinon, jespère quau 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 plus puissant des commandes provient de lutilisation du kill-ring, qui fonctionne comme dans Emacs. ctrl-y pour coller le dernier ctrl-w / ctrl-u / ctrl-backspace / alt-d. alt-y pour parcourir lancien texte tué.

Plusieurs ctrl-w ou quoi que ce soit dans une ligne font sur lentrée kill-ring. Utilisez les flèches gauche et droite ou quelque chose pour diviser lentrée si vous souhaitez supprimer deux éléments et nen coller quun plus tard.

En combinant tous ces éléments ensemble, 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 quil était avant den supprimer une partie.
  • alt- > pour aller à la fin de lhistorique (cest-à-dire avec la flèche vers le bas jusquau bout), pour revenir à la commande dans laquelle vous vous trouviez.

Autres conseils dutilisation interactive:

Activez shopt -s globstar, ainsi vous pouvez faire **/*.c (récursif, y compris le dir). Parfois pratique pour une utilisation interactive, mais généralement find -name "*.c" -exec foo {} + est mieux.

Si vous écrivez des scripts bash, vous trouverez pratique davoir shopt -s extglob également activé dans vos shells interactifs. Vous trouverez parfois une utilisation pour des éléments tels que *.!(c|h) pour faire correspondre des fichiers qui ne se terminent pas avec .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 gentils. Ne prenez pas lhabitude de dépendant deux pour faire un rm sélectif. GNU rm « s -Je demande une fois pour tous les arguments.)

Jaime alias m=less (m pour « plus »). Jai less configuré avec , et . lié au fichier précédent / suivant (lesskey). La valeur par défaut est une séquence à plusieurs touches qui ne peut pas être utilisée avec la répétition automatique.


Jaime tout faire à lintérieur de lécran GNU. Je trouve quil est plus facile de garder une trace des fenêtres décran numérotées quun bateau plein donglets dans Konsole (ou tout autre émulateur de terminal que jai 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é douverture dun nouveau shell avec le même cwd quun autre shell, jutilise un hook personnalisé pour cd / pushd / popd qui me permet de faire cds 8 pour cd vers nimporte quoi dir mon shell dans la fenêtre écran 8 utilise. Cela fonctionne même pour les shells en dehors de la session écran, tant quil ny a quune seule session écran.

Commentaires

  • Le mien ne ‘ semble être  » correctement configuré « . De nombreux raccourcis que je vois ici ne fonctionnent pas ‘, jutilise le terminal standard dUbuntu 14.04. Comment puis-je le configurer?
  • @JorgeeFG: Je pense que cela a fonctionné pour moi avec gnome-terminal dans Ubuntu 14.04, avant de passer à KDE. Loption appropriée est dans les paramètres de votre terminal, esc-prefix vs hig h-bit, et peut-être dautres paramètres. Certains dentre eux ne ‘ ne fonctionnent pas parfaitement pour moi grâce à ssh. (par exemple, ctrl gauche / droite munge le code déchappement de la touche fléchée, et jobtiens 5D qui apparaît littéralement)

Réponse

Ajoutez les lignes suivantes à votre ~/.inputrc

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

Ceci est similaire à la réponse degmont, mais au lieu dutiliser Page Up et Page Down, 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.

Réponse

Jai toujours tendance à configurer mes machines avec un HISTSIZE pour conserver une liste dhistorique plus longue, ainsi que HISTTIMEFORMAT avec la valeur dhorodatage donc Je peux voir quand la commande a été exécutée.

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

Réponse

Le moyen que jutilise habituellement est de combiner les history commande avec grep

IE:

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.

IE:

history | grep history

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

suivi de: !571

répétera history | grep history

Commentaires

  • CR = beaucoup mieux + beaucoup plus sûr
  • Peut-être, personnellement, je trouve quune histoire envoyée à grep est un moyen plus rapide de trouver la plupart des commandes. En ce qui concerne Safer, je ‘ ne sais pas ce que vous voulez dire, quels sont les risques inhérents à l’utilisation de l’historique associé à une recherche avec cR?
  • @ Gravy Je suppose que PSkocik signifie que la substitution dhistorique de ! est moins sûre.
  • @Gravy Les risques inhérents seraient accidentellement une mauvaise ligne. Aucune idée de la raison pour laquelle votre terminal a gelé, sauf si vous avez utilisé Control-S et que le contrôle de flux xon / xoff est activé (souvent par défaut). Si tel est le cas, Control-Q le ramènera.
  • Je suis daccord avec @PSkocik, cr est beaucoup mieux car il ‘ s plus facile déditer la ligne dhistorique, plutôt que de simplement lexécuter à nouveau de la même manière. Exécuter à nouveau la commande exactement la même est un cas trivial de ce que vous pouvez faire pour gagner du temps en retapant des variations sur des one-liners complexes, ou en complétant un fichier différent dans un long chemin. Voir ma réponse.

Réponse

Jai utilisé quotidiennement 4 astuces (et quelques autres) dans mon terminal bash:

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

  • Exécuter la commande N de lhistorique: !N

  • Imprimer la dernière commande commençant par préfixe de lhistorique: !prefix:p

  • Exécuter la dernière commande commençant par prefix de lhistorique: !prefix

Commentaires

  • Je pense que lutilisation de la commande N de lhistorique est lune des les plus grands chemins pour se tirer une balle dans le pied pour la plupart des humains 🙂 Il suffit de dire

Répondre

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

Vous pouvez naviguer dans lhistorique 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 inclut de nombreuses autres fonctionnalités, par exemple alias, thèmes, plugins. Ces extras rendent la distribution plus complexe à utiliser quun raccourci clavier.

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

Commentaires

  • oh-my-zsh contient des tonnes de trucs. Vous pourriez aussi bien dire: cette fonctionnalité exacte est incluse dans cette distribution, lorsque tout ce dont vous avez besoin est un paramètre ou une application spécifique.
  • Jai édité le message: jai averti quil est plus grand quune simple application.

Réponse

Ajoutez lalias 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 ne pourrais pas trouver d’autres moyens d’éviter les guillemets simples.

Commentaires

  • fyi – h="history | awk '{\$1=\"\"; print}' devrait fonctionner. Sinon, créez une fonction et appelez-la.
  • merci DarkHeart, mais jai essayé votre code, trouvé non fonctionné dans mon environnement, peut-être quil y a quelque chose de différent dans le mien

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *