Comment puis-je me déplacer efficacement sur la ligne de commande bash?


19

J'utilise donc le updans mon shell (Bash sur OSX ou Ubuntu, principalement) mais parfois je sais que je veux les trucs après l'emplacement actuel du curseur. Existe-t-il un moyen de compléter la ligne sur laquelle je suis avec la ligne ci-dessus? Frapper upet leftc'est ennuyeux.

Tous les autres trucs seraient cool aussi, à l'exception de tab, dont nous parlons tous maintenant :)

Voici un exemple (à la demande de ~ quack):

Je tape mkdir /where/the/hell/is/that/thingpuis je veux enregistrer dans le même répertoire. Mais maintenant je connais le meta-b :)


1
un exemple explicite serait génial.
Quack Quichote

@ ~ charlatan faisant l'exemple maintenant
Dan Rosenstark

1
voici une question connexe (en double), avec une réponse assez sympa: superuser.com/questions/124336/…
cregox

Réponses:


11

Essaye ça:

mkdir /where/the/hell/is/that/thing

puis appuyez sur alt+.

en fonction de votre système d' exploitation et le terminal que vous pourriez avoir à taper escalors.

Vous pouvez également appuyer sur alt+ 1+ .pour choisir un argument antérieur spécifique.

C'est bien mieux que !! ou! $ parce que vous pouvez réellement voir ce que vous vous apprêtez à exécuter, et cela prend quand même moins de frappes.

edit: à proprement parler, ce n'est metapas le cas alt, il peut donc aussi fonctionner avec la touche "windows" en fonction de la configuration de votre clavier.


intéressant! ne connaissait pas celui-là.
Quack Quichote

2
@justin c'est génial. Sur OSX meta est escape.
Dan Rosenstark

@yar avec OS X Terminal, il existe également un paramètre de préférence sous «Paramètres» -> «Clavier» pour «utiliser l'option comme méta-clé».
ThomasW

Merci @ThomasW Je dois revenir sur ce truc. Je suis en ligne de commande tous les jours, mais utilise très peu d'astuces.
Dan Rosenstark

28

Vous devriez lire man bash sur votre système, en particulier la section sur Readline , car il s'agit du mécanisme d'entrée interactif de bash. Le manuel de Bash sur gnu.org contient une belle section sur l' édition en ligne de commande qui aidera à combler certaines lacunes.

Par défaut, vous pouvez les utiliser pour vous déplacer sur la ligne de commande (en énumérant quelques-uns ici; voir le lien pour une liste complète):

  • Ctrl+ ase déplace au début de la ligne (ou Homeselon les paramètres du terminal)
  • Ctrl+ ese déplace à la fin de la ligne (ou End...)
  • Meta+ favance d'un "mot"
  • Meta+ brecule d'un "mot"

Vous pouvez les utiliser pour "tuer" (alias "couper") le texte d'une ligne:

  • Ctrl+ ktue ("coupe") le texte de la position actuelle du curseur jusqu'à la fin de la ligne
  • Ctrl+ yarrache ("colle") le texte le plus récemment tué dans le tampon au niveau du curseur

Vous pouvez donc les combiner pour sélectionner un morceau de la ligne de commande que vous souhaitez répéter, le tuer, puis le coller à la fin de votre prochaine commande.


Maintenant, pour le rendre encore plus amusant, considérons l' extension historique de bash . C'est ce !!que mentionne la réponse de Studer . Pauses d'extension vers le bas dans l' histoire désignateurs d'événements , désignateurs de mots , et modificateurs .

Les désignateurs d' événements ressemblent à ceci (encore une fois, voir les liens pour la liste complète):

  • ! - démarre une substitution d'historique
  • !n- la n-ième commande dans la liste d'historique de bash, pour un entier n (fonctionne aussi pour les négatifs)
  • !!- la commande précédente; équivalent à!-1
  • !string- la commande la plus récente commençant par string

Les désignateurs de mots sélectionnent certaines parties d'un événement. Utilisez :pour séparer l'événement du mot désignateur. Les mots sont numérotés à partir de 0 à partir du début de la ligne et insérés dans la ligne actuelle séparés par des espaces simples.

  • $- désigne le dernier argument (par exemple, !!:$est le dernier argument de la dernière commande; peut être raccourci !$)
  • n- désigne le nième mot (par exemple, !str:2est le 2e argument de la commande la plus récente commençant par str ; !!:0est la commande de la dernière commande)

Donc, pour reprendre votre exemple, si votre dernière commande est mkdir /some/really/long/path, le simple fait d'exécuter à !!nouveau exécutera cette commande à nouveau. Mais vous voulez cdplutôt suivre ce chemin:

$ cd !$

Supposons maintenant que vous exécutiez d'autres commandes et que vous souhaitiez ensuite vous référer à nouveau à ce chemin. Si c'était la dernière commande mkdir que vous avez exécutée, vous pouvez l'utiliser pour répéter ce chemin:

$ tar czf ~/foo.tgz !mkdir:$

vous pouvez également les lier (et d'autres commandes Readline) à toutes les combinaisons de touches que vous aimez; voir la section 8.4 du manuel, Bindable Readline Commands: gnu.org/software/bash/manual/… et la section 8.3, Readline Init File: gnu.org/software/bash/manual/bashref.html#Readline-Init-File
quack quixote

merci qui aide vraiment. Bien que "lire le manuel" était un peu attendu, mentionner le déplacement de base des liaisons aide. Même le simple fait de savoir ctrl-a pourrait représenter de réelles économies.
Dan Rosenstark

@quack, pas de problème, j'ai attrapé une révision ultérieure, en fait :)
Dan Rosenstark

1
notez bind -pou bind -Pimprimerez également vos raccourcis clavier actuels; c'est la référence ultime pour ce que votre bash utilise.
Quack Quichote

1
Je pense que cette réponse a grandi: le contenu de History Expansion est génial.
Dan Rosenstark

6

Si vous êtes un utilisateur vi, vous pouvez mettre le shell en mode vi en tapant set -o vi.

Vous pouvez ensuite faire toutes sortes de choses puissantes sur la ligne de commande après avoir tapé Esc + k.

Celui que j'utilise le plus est Esc+Kalors /tout texte tapé après que la barre oblique sera utilisée pour rechercher dans l'historique de votre ligne de commande.

eg Esc + k /smbclient donnera la dernière commande smbclient que vous avez tapée. Vous pouvez faire défiler toutes les recherches à l'aide des touches vi standard ( jet kpour les flèches haut et bas, mais je pense que les flèches haut et bas fonctionneront également).

Plus d'aide ici , il y a aussi des choses bash intégrées à ce lien qui pourraient être plus ce que vous recherchez.

À la vôtre, Stu.


alors que le mode vi est inutile pour moi, puisque je ne suis pas encore passé à vi, l'encre l est géniale. Merci pour ça!
Dan Rosenstark

1
L'équivalent sans mode vi est ctrl-r. Tapez-le, puis faites partie d'une commande précédente. Il affichera la dernière occurrence de ce qui a été tapé. Appuyez à nouveau sur ctrl-r pour passer au suivant. Très utile.
Nerdfest

3

Vous pouvez utiliser !!ce qui représente la dernière commande:

% test
% écho !!
> test

intéressant. Pas sûr que je veuille ensuite manipuler cette chaîne en utilisant ... quoi?
Dan Rosenstark

cela fait partie des fonctionnalités d'historique de bash: gnu.org/software/bash/manual/… .. en particulier l'extension historique: gnu.org/software/bash/manual/bashref.html#History-Interaction ... note!! est un synonyme pour !-1: gnu.org/software/bash/manual/bashref.html#Event-Designators
Quack Quizz Quote

2
C'est vraiment utile lorsque vous oubliez d'utiliser sudo: ie sudo !! - $ more / etc / sudoers / etc / sudoers: Autorisation refusée $ sudo !! sudo more / etc / sudoers [sudo] mot de passe pour ..: # / etc / sudoers ... ... ...
user9632

@wookiebreath, merci pour cela, je voterai cette réponse maintenant
Dan Rosenstark

0

Dans l'exemple que vous donnez, utilisez! $ Pour représenter le dernier paramètre de la commande précédente:

mkdir / quelque chose / quelque chose d'autre

cd! $

Vous pouvez également utiliser des variations numérotées pour extraire des paramètres spécifiques des commandes précédentes.


0

J'ai récemment trouvé cette feuille de triche readline très utile. Beaucoup de choses que je ne savais pas. J'utilisais !$tout le temps jusqu'à ce que je découvre Alt+ ., que j'utilise maintenant tout le temps. :)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.