Comment stocker rapidement et accéder aux commandes souvent utilisées?

37

J'ai beaucoup de commandes à exécuter régulièrement, souvent avec la moindre variation.

En ce moment, je les stocke tous .bash_historyet les utilise CTRL- Rpour y accéder, mais je me demande s’il existe un meilleur moyen. Ce que je cherche:

  • Facile d'ajouter une nouvelle commande
  • Facile à rechercher et à ré-exécuter une commande voulue
  • Évitez les commandes indésirables dans les suggestions

Malheureusement, bash_history n’est pas aussi fort à la troisième demande: si je fais quelques cd- uns et lscela remplit rapidement le fichier d’historique. J'ai récemment appris HIST_SIZEque vous pouvez configurer l'historique pour éviter les doublons ou certaines commandes, mais avant de configurer tout cela, je voulais m'assurer que c'était le meilleur moyen.

Konerak
la source
7
pour les commandes de tous les jours, aliaspeut - être plus utile. par exemple. alias gfc="git fetch origin"
numéro5

Réponses:

20

Je trouve très utile les commandes readline suivantes

history-search-backward,
history-search-forward

(être conscients qu'ils sont différents de l'habituel reverse-search-history, forward-search-history, lié à Ctrl- R, Ctrl- S).

J'ai ces commandes associées à Ctrl- Upet Ctrl- Downmettant les lignes suivantes dans ~/.inputrc:

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

Comment ils fonctionnent: écrivez quelques caractères du début de la commande, appuyez sur Ctrl- Upet la prochaine commande plus ancienne commençant par ce préfixe sera affichée, appuyez à nouveau pour voir le suivant, et ainsi de suite. Lorsque vous êtes satisfait, après avoir éventuellement modifié la commande, appuyez sur Enterpour exécuter.

enzotib
la source
1
+1 pour cela, je fais la même chose bien que je les ai juste liés aux touches Flèche Haut et Flèche Bas (sans modificateur CTRL), ce qui fonctionne pour moi. Si vous voulez faire de même, les lignes dont vous avez besoin sont "\e[B": history-search-forwardet"\e[A": history-search-backward
Simon Whitaker
Pensez également à la culture HISTFILESIZEet / ou HISTSIZE(zsh ne prend en charge que HISTSIZE, bash les deux) pour vous assurer que votre mémoire tampon est suffisamment grande. La question SO bash HISTSIZE vs. HISTFILESIZE? peut illuminer plus loin.
Adam Katz
56

Autre astuce: j'utilise parfois des commentaires pour marquer / marquer une commande:

my_command #bookmark

puis:

[ctrl-r]#bookmark
Chris J
la source
J'adore!
Greg
17
Bashtags! Génie. :-)
Simon Whitaker
Très agréable! Je vais aussi utiliser ça pour mon mysql-cli :)
Konerak
C'est excellent! Malheureusement, zshell ne considère pas # comme le début d'un commentaire dans une session interactive. Connaissez-vous un truc similaire pour cela?
Nathan Long
1
@NathanLong: $_bookmark. On pourrait faire valoir qu'il s'agit d'un pirate horrible exploitant le fait que les variables inexistantes s'étendent à rien, mais cela fonctionne certainement, avec la mise en garde que les espaces ne sont pas autorisés (utilisez _ à la place).
Kampu
7

Bien que de portée très limitée, je voudrais souligner ces deux espaces réservés d'extension:

!! 

est un développement d'espace réservé pour la dernière commande. Utile si vous avez oublié de mettre sudoavant la commande.

!$ 

répète le dernier paramètre. Utile si vous voulez répéter une commande différente aveca/very/long/path/name/you/do/not/want/to/type/again

Chiborg
la source
Oui, bon conseil ... si seulement je me rappelais de les utiliser :)
Jeach
6

Utilisez 'alias'

alias est un excellent outil pour cela.

  • Vous pouvez facilement en déclarer un sur la ligne de commande à utiliser pendant la session shell en cours.
  • Si vous l'utiliserez plus tard, vous pourrez l'ajouter à votre configuration de shell.

Lorsque vous utilisez un alias, c'est exactement comme si vous l'aviez dactylographié, c'est donc assez flexible. Par exemple, vous pouvez l'utiliser avec des tuyaux:

alias findfoo="grep 'foo'"
echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo # Does your custom grep

Vous devriez pouvoir faire de "légères variations" en passant tous les drapeaux que vous n'avez pas déjà spécifiés.

echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo -v # finds non-matches
Nathan Long
la source
5

Je crée des scripts shell minimaux pour mes commandes fréquentes et leur donne des noms abrégés. Ils sont tous stockés au même endroit, auquel on ajoute PATH.

De cette façon, j'ai un accès raccourci à des commandes très complexes et, contrairement à, aliasje peux transformer les parties modifiables de ma tâche en arguments de ligne de commande de mon raccourci.

David Grellscheid
la source
3
Si vous souhaitez simplement passer des arguments, envisagez plutôt de définir des fonctions. Si vous avez besoin de scripts complets, c'est une bonne solution :)
Konerak
@ Konerak, je vais devoir essayer ça. En général, je fais juste un script, mais je parie que définir des fonctions serait beaucoup plus simple.
ixtmixilix
4

Je conserve une copie de .bash_history dans Git . Pour simplifier cela, j'ai mis

# don't put duplicate lines in the history
# don't save commands which start with a space
HISTCONTROL=ignoredups:erasedups:ignorespace

# append to the history file, don't overwrite it
shopt -s histappend

dans .bashrc et les commandes suivantes (modifiées pour une utilisation générale) dans un script de nettoyage

# Ensure a single space at the end of each line to easier add more parameters
sed -i -e 's/ *$/ /' "~/.bash_history"

sort --unique --output="~/.bash_history" "~/.bash_history"

que je lance avant d’ajouter des lignes git gui. Puisque le fichier d'historique est modifié avec chaque commande, j'ai également une commande spéciale pour mettre à jour ce référentiel spécifique:

git stash && git pull && git stash pop
l0b0
la source
+1 principalement pour mentionner HISTCONTROL=ignorespace, ce qui est important pour ne pas encombrer l’histoire parfois.
quodlibetor
2

Parmi toutes les autres réponses ici impliquant l'histoire.

J'ai mis

HISTFILESIZE=2024
HISTSIZE=1024

dans ~ / .bash_profile

En plus des autres commentaires concernant l'histoire

Une autre fonctionnalité utile ...

Commencer un rappel de l'histoire avec

!first few letters<ESC>Ctrl-E

se souviendra de la dernière commande qui a commencé avec les premières lettres

par exemple:

!find<ESC>Ctrl-E

Vous n'avez pas mentionné si vous utilisez ou non une interface graphique ou uniquement une ligne de commande. Si vous utilisez une interface graphique, vous pouvez utiliser l'un des gestionnaires de Presse-papiers persistants pour copier / coller les commandes, les ID utilisateur, les mots de passe, les URL, etc. couramment utilisés.

bsd
la source
Wow, !find<ESC>CTRL-Eça marche, mais je doute que je puisse m'en souvenir demain. Qu'est-ce que l'ESC CTRL-E?
Konerak
juste une liaison à une clé étendue
bsd
0

Apprendre à utiliser Ctrl-Ret Ctrl-Spermet de rechercher facilement les commandes que vous recherchez dans l'historique, et vous avez déjà trouvé la variable d'environnement HISTCONTROL ignorer les doublons et modifier le site du fichier d'historique de bash.

Je fais habituellement beaucoup Ctrl-Rde Ctrl-Echangements suivis et modifiés, si je sautais une commande trouvée en appuyant Ctrl-Rtrop souvent, Ctrl-Sà la rescousse.

Evgeny
la source
2
Le terminal est souvent configuré de manière à ce que Ctrl-S soit la séquence "stop", et non (directement) disponible pour la recherche en aval.
enzotib
Dans de tels cas, la recherche directe peut être remappée sur autre chose que <kbd> Ctrl-S </ kbd>.
Evgeny
0

Je préfère toujours stocker les dernières commandes utilisées et leur sortie.

script filename
Balaswamy Vaddeman
la source
0

En plus des bonnes réponses ci-dessus, si vous utilisez un gui basé sur kde ou gnome, alors AutoKey peut être incroyablement utile.

https://code.google.com/p/autokey/

Il vous permet de créer des phrases déclenchées en saisissant quelques caractères ou en appuyant sur une touche de raccourci. Ces phrases sont ensuite substituées ou ajoutées à votre saisie.

Il prend également en charge les scripts écrits en python que vous pouvez faire faire presque n'importe quoi si vous connaissez python. Je ne connais pas encore python, mais je suis déjà en train de recevoir des scripts très basiques pour faire des choses ordonnées.

Tout semble provenir de votre clavier, de sorte que cela fonctionne avec toutes les applications acceptant la saisie au clavier - et avec votre bureau lui-même.

Il a beaucoup d'options contrôlant comment et où ces choses sont activées, vous pouvez donc en avoir certaines qui ne fonctionnent que dans votre console et d'autres qui ne fonctionnent que dans une autre fenêtre. Vous pouvez également configurer les phrases pour qu'elles s'exécutent dès que vous tapez la chaîne qui les déclenche ou attendez de leur donner le mot OK.

Joe
la source
0

Comme d’autres l’ont dit, alias est ton ami. Pour des choses un peu plus compliquées (quand vous avez besoin d'arguments quelque part entre les instructions), j'utilise des fonctions dans mon .zshrc, comme:

function ff() { find . -iname "*$**" }

cela fonctionne comme localiser (je l'utilise quand, pour une raison quelconque, db n'est pas disponible). Ou

function chuck() { ps aux | grep $1 | tr -s '\t' ' ' | cut -f2 -d' ' | xargs kill $2 }

pour un substitut de killall.

rkj
la source
0

En plus d’utiliser Cntl-Rpour regarder en arrière dans le .bash_history, j’ai aussi un fichier README dans le ~/developrépertoire où je mets de longues commandes comme pour git/ svn, afin que je puisse y revenir plus tard quand j’aurai besoin. De même, je ~/install/READMEprévois de créer un fichier contenant tous les noms de paquetages habituels que j’installe habituellement après l’installation d’une nouvelle version de Linux / Ubuntu. L’idée est donc d’avoir un fichier README dans chaque répertoire, par exemple Vidéo, Audio, ... et de leur indiquer les commandes / conseils courants que vous devrez peut-être connaître ultérieurement.

Amr
la source