¿Cómo almacenar y acceder rápidamente a los comandos de uso frecuente?

37

Tengo muchos comandos que necesito ejecutar rutinariamente, a menudo con la más mínima variación.

Ahora mismo todos ellos estoy almacenando en .bash_historyuso CTRL- Rpara acceder a ellos, pero me pregunto si hay una manera mejor. Lo que estoy buscando:

  • Fácil de agregar un nuevo comando
  • Fácil de buscar y volver a ejecutar un comando deseado
  • Evite comandos no deseados en sugerencias

Desafortunadamente, bash_history no es tan fuerte en la tercera demanda: si hago algunas cdy lsllena rápidamente el archivo de historial. Recientemente me enteré HIST_SIZEy puedes configurar el historial para evitar duplicados o ciertos comandos, pero antes de configurar todo eso, quería asegurarme de que sea la mejor manera.

Konerak
fuente
77
para comandos cotidianos, aliasquizás más útil. p.ej. alias gfc="git fetch origin"
número5

Respuestas:

20

Encuentro muy útiles los siguientes comandos de readline

history-search-backward,
history-search-forward

(tenga en cuenta que son diferentes a los habituales reverse-search-history, forward-search-historyatado a Ctrl- R, Ctrl- S).

Tengo estos comandos asociados a Ctrl- Upy Ctrl- Downponiendo las siguientes líneas en ~/.inputrc:

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

Cómo funcionan: escriba algunos caracteres del comienzo del comando, presione Ctrl- Upy se mostrará el siguiente comando anterior que comience con ese prefijo, presione nuevamente para ver el siguiente, y así sucesivamente. Cuando esté satisfecho, después de posiblemente modificar el comando, presione Enterpara ejecutar.

enzotib
fuente
1
+1 para esto, hago lo mismo aunque solo los tengo vinculados a las teclas de flecha arriba y flecha abajo (sin modificador CTRL), lo que funciona para mí. Si desea hacer lo mismo, las líneas que necesita son "\e[B": history-search-forwardy"\e[A": history-search-backward
Simon Whitaker
También considere el crecimiento HISTFILESIZEy / o HISTSIZE(zsh solo admite HISTSIZE, bash admite ambos) para garantizar que su búfer sea lo suficientemente grande. La pregunta SO bash HISTSIZE vs. HISTFILESIZE? Puede iluminar más.
Adam Katz
56

Otro consejo: a veces uso comentarios para marcar / etiquetar un comando:

my_command #bookmark

luego:

[ctrl-r]#bookmark
Chris J
fuente
¡Me encanta!
Greg
17
Bashtags! Genio. :-)
Simon Whitaker
¡Muy agradable! Voy a usar esto para mi mysql-cli también :)
Konerak
Eso es excelente! Desafortunadamente, zshell no trata # como el comienzo de un comentario en una sesión interactiva. ¿Conoces un truco similar para eso?
Nathan Long
1
@NathanLong: $_bookmark. Se podría argumentar que este es un truco horrible que explota el hecho de que las variables inexistentes se expanden a la nada, pero ciertamente funciona, con la advertencia de que los espacios no están permitidos (use _'s en su lugar).
Kampu
7

Aunque tiene un alcance muy limitado, me gustaría señalar estos dos marcadores de posición de expansión:

!! 

es una expansión de marcador de posición para el último comando. Útil si olvidó poner sudoantes del comando.

!$ 

repite el último parámetro. Útil si desea repetir un comando diferente cona/very/long/path/name/you/do/not/want/to/type/again

chiborg
fuente
Sí, un gran consejo ... si solo recordara usarlos :)
Jeach
6

Use 'alias'

alias Es una gran herramienta para esto.

  • Puede declarar fácilmente uno en la línea de comando para utilizarlo durante la sesión de shell actual.
  • Si lo usará en el futuro, puede agregarlo a su configuración de shell.

Cuando usa un alias, es exactamente como si lo hubiera escrito, por lo que es bastante flexible. Por ejemplo, puede usarlo con tuberías:

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

Debería poder hacer "pequeñas variaciones" pasando cualquier indicador que no haya especificado.

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

Creo scripts de shell mínimos para mis comandos frecuentes y les doy nombres cortos. Todos se almacenan en el mismo lugar, al que se agrega PATH.

De esa manera, tengo acceso directo a comandos muy complejos y, a diferencia de esto alias, puedo convertir las partes modificables de mi tarea en argumentos de línea de comandos de mi acceso directo.

David Grellscheid
fuente
3
Si solo quiere pasar argumentos, considere definir funciones en su lugar. Si necesita scripts completos, esta es una buena solución :)
Konerak
@Konerak Tendré que intentarlo. Por lo general, solo hago un script, pero apuesto a que definir funciones sería mucho más claro.
ixtmixilix
4

Estoy manteniendo una copia de .bash_history en Git . Para simplificar esto, he configurado

# 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

en .bashrc y los siguientes comandos (modificados para uso general) en un script de limpieza

# 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 ejecuto antes de agregar líneas git gui. Como el archivo de historial se modifica con cada comando, también tengo un comando especial para actualizar ese repositorio específico:

git stash && git pull && git stash pop
l0b0
fuente
+1 principalmente por mencionar HISTCONTROL=ignorespace, que a veces es importante para no saturar el historial.
quodlibetor
2

Entre todas las otras respuestas aquí relacionadas con la historia.

lo puse

HISTFILESIZE=2024
HISTSIZE=1024

en ~ / .bash_profile

Además de los otros comentarios re: historia

Otra característica útil ...

Comenzando un retiro de historia con

!first few letters<ESC>Ctrl-E

recordará el último comando que comenzó con las primeras letras

p.ej:

!find<ESC>Ctrl-E

No mencionó si está utilizando una GUI o solo una línea de comandos. Si está utilizando una GUI, puede usar uno de los administradores de portapapeles persistentes para copiar / pegar comandos, ID de usuario, contraseñas, URL, etc.

bsd
fuente
Wow, !find<ESC>CTRL-Efunciona, pero dudo que pueda recordarlo mañana. ¿Qué es ese ESC CTRL-E?
Konerak
sólo una unión a una clave extendida
BSD
0

Aprende a usar Ctrl-Ry Ctrl-Spermite buscar fácilmente los comandos que está buscando en el historial, y ya encontró la variable de entorno HISTCONTROL para ignorar los duplicados y cambiar el sitio del archivo de historial de bash.

Por lo general, hago muchos Ctrl-Rseguidos Ctrl-Ey cambiando algunos parámetros, si omito un comando encontrado al golpear Ctrl-Rdemasiadas veces, Ctrl-Sal rescate.

Evgeny
fuente
2
A menudo, el tty está configurado de tal manera que Ctrl-S es la secuencia de "detención" y no está (directamente) disponible para la búsqueda hacia adelante.
enzotib
En tales casos, la búsqueda hacia adelante se puede reasignar a algo que no sea <kbd> Ctrl-S </kbd>.
Evgeny
0

Siempre prefiero almacenar los últimos comandos usados ​​y su salida.

script filename
Balaswamy vaddeman
fuente
0

Además de las buenas respuestas anteriores, si está utilizando una interfaz gráfica de usuario basada en kde o gnome, entonces AutoKey puede ser increíblemente útil.

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

Le permite crear frases que se activan escribiendo algunos caracteres o presionando una tecla de acceso rápido. Estas frases se sustituyen o se agregan a su entrada.

También admite scripts escritos en python que puede hacer que haga casi cualquier cosa si conoce python. Todavía no conozco Python, pero ya estoy obteniendo algunos scripts muy básicos para hacer cosas ordenadas.

Todo parece provenir de su teclado, por lo que funciona con cualquier aplicación que acepte la entrada del teclado, y con su escritorio mismo.

Tiene muchas opciones para controlar cómo y dónde se activan estas cosas, por lo que puede tener algunas que solo funcionan en su consola y otras que solo funcionan en otra ventana. También puede configurar frases para que se ejecuten tan pronto como escriba la cadena que las desencadena o espere hasta que les dé el visto bueno.

Joe
fuente
0

Como otros han dicho, alias es tu amigo. Para cosas un poco más complicadas (cuando necesita argumentos en algún lugar entre instrucciones), uso funciones en mi .zshrc, como:

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

que funciona como localizar (lo uso cuando por alguna razón db no está disponible). O

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

para un sustituto de killall.

rkj
fuente
0

Además de usar Cntl-Rpara mirar hacia atrás en el .bash_history, también tengo un archivo README en el ~/developdirectorio donde pongo comandos largos como for git/ svn, para poder volver a ellos más tarde cuando sea necesario. Del mismo modo, planeo tener un ~/install/READMEarchivo para poner todos los nombres de paquetes comunes que suelo instalar después de instalar una nueva versión de Linux / Ubuntu. Por lo tanto, la idea es tener un archivo README dentro de cada directorio, por ejemplo, Video, Audio, ... y poner en ellos los comandos / consejos comunes, que tal vez necesite saber más adelante.

Amr
fuente