2010-09-17 4 views
5

A veces tengo que ejecutar un comando varias veces seguidas, por ejemplo, para ver si un servicio se ha iniciado, y resulta tedioso alejar mis manos de mi posición de escritura normal para presionar las teclas de flecha arriba e Intro repetidamente. ¿Hay alguna manera de ejecutar el comando anterior sin las teclas de flecha arriba e Intro, quizás con un elaborado script de shell?Alternativa a la flecha arriba + Entrar para ejecutar el comando anterior?

He intentado lo siguiente, pero es insatisfactorio porque no puede ejecutar alias, y es un poco lento.

history | tail -2 | head -1 | cut -d' ' -f4- | cat > prev_command.txt 
sleep .01 
chmod 777 prev_command.txt 
eval prev_command.txt 
rm prev_command.txt 

Lo ideal sería que tendría un alias para esta secuencia de comandos para que pueda escribir algo como "anterior" en la línea de comandos y pulse Enter para ejecutar el comando anterior de nuevo.

+0

Entonces, escribir "prev" es más rápido que subir + enter? – halfdan

+3

se debe mover a superuser.com – stepancheg

Respuesta

3

En bash:

 
$ help fc 
fc: fc [-e ename] [-lnr] [first] [last] or fc -s [pat=rep] [command] 
    Display or execute commands from the history list. 

    fc is used to list or edit and re-execute commands from the history list. 
    FIRST and LAST can be numbers specifying the range, or FIRST can be a 
    string, which means the most recent command beginning with that 
    string. 

    Options: 
     -e ENAME select which editor to use. Default is FCEDIT, then EDITOR, 
      then vi 
     -l list lines instead of editing 
     -n omit line numbers when listing 
     -r reverse the order of the lines (newest listed first) 

    With the `fc -s [pat=rep ...] [command]' format, COMMAND is 
    re-executed after the substitution OLD=NEW is performed. 

    A useful alias to use with this is r='fc -s', so that typing `r cc' 
    runs the last command beginning with `cc' and typing `r' re-executes 
    the last command. 

    Exit Status: 
    Returns success or status of executed command; non-zero if an error occurs. 

Nota la sugerencia de alias r; Lo uso con frecuencia

15

En bash, puede pulsar Ctrl p para ir a la orden anterior - que es mucho mejor que tener que desplazarse a las teclas de flecha.

+0

Esto también funciona en 'tcsh'. –

+0

En ksh y zsh, usar "r" también funciona. –

+4

Y '' ctrl + n'' para volver al siguiente comando si llega demasiado lejos. – davidjb

1

Dependiendo de qué terminal esté utilizando, sé que solía tener F3 como opción para repetir, pero eso todavía está fuera del rango normal para escribir a menos que tenga un teclado especial con teclas de función más accesibles.

Mi teclado hace que las teclas de función sean fácilmente accesibles, pero ya no hago mucho trabajo de línea de comandos en Unix, por lo que no podría decirle con certeza si esto todavía es posible.

7

Uso

!!

ejecutar el comando anterior.

sudo !! 

funciona también, para el registro.

+0

¿Hay alguna manera de ponerlo? o ctrl p en la respuesta siguiente en un alias? He intentado con alias l = '!!', pero me da un error de "bash: !!: command not found" cuando lo ejecuto. – Thomas

4

En lugar de ejecutar el mismo comando varias veces seguidas, ¿por qué no watch en su lugar? watch ejecutará un comando especificado repetidamente y mostrará la salida en stdout para que pueda ver cómo cambia con el tiempo.

watchcommand

2

Es usted un emacs o vi usuario? Puede usar

set -o vi 
set -o emacs 

para establecer las combinaciones de teclas emacs o vi. A continuación, puede usar los enlaces clave emacs o vi en bash. No sé si esto debería funcionar para otras conchas. Creo que el modo vi comienza en modo insertar, por lo que debe presionar esc para ingresar al modo de comando. En el modo emacs (el predeterminado), puede usar ctrl + p y luego ctrl + j para moverse a la línea anterior y hacer un retorno de carro.

De lo contrario, puede usar !! como alguien más sugirió.

Cuestiones relacionadas