El comando de historia

El comando de historia

Con frecuencia, en la Terminal (aunque espero que cualquier respuesta funcione en bash y en la mayoría de los demás), escribo algún comando y luego obtengo algún tipo de error de permiso debido a que falta el archivo sudo.

Bien, entonces presiona 'arriba', mantén presionado/martilla 'izquierda', escribe sudoy presiona 'enter'.

Es molesto. Más aún cuanto más larga era la orden.

Tenga en cuenta que faltar sudoes el peor de los casos; un error tipográfico más cerca del principio que del final es igualmente molesto.

Lo que me gustaría es una forma de realizar una especie de pulsación de tecla "arriba y en casa". En realidad, tal vez esos dos trazos sean suficientes, pero el teclado de mi Macbook no tiene Inicio, así que no puedo intentarlo.

Puntos de bonificación por una forma de insertar sudoy presionar 'enter' automáticamente también, por ejemplo, con CMD+Shift+S.


¿Se puede hacer esto o estoy soñando?

Respuesta1

Simplemente use UPy CTRL-A.

Ambos !sudoy sudo !!funcionan fácilmente. Con una diferencia:

  • sudo !!ejecutará el último comando tomado del historial al sudoprincipio.

  • !sudoejecutará el último comando en el historial que comenzó con sudo.

  • Por lo general, CTRL-Alo lleva al principio de la línea en una terminal de Linux y CTRL-Ehasta el final.
    Si quieres puedes seguir usando tu estrategia. Sólo tienes que descubrir el acceso directo de tu sistema. Puedes encontrar una lista deatajosen entorno gráfico y textualpor ejemplo aquí.

Sólo unadvertencia: sudo !!y !sudofuncionan muy rápido yno tienes control visual de la línea que estás ejecutando como superusuario. Esto puede resultardañinoa veces. Especialmente si incurres en un error tipográfico.

Hagamos un ejemplo dramático:

cd $HOME/Directory_To_Delete  # You go to delete what is inside a directory
rm -rf . ; cd ..              # You do it and go up of one
 apt-get update               # Note the space in the beginning of the line  
sudo !!                       # Gone!! Now you realize you never really wanted 

¡Demasiado tarde, borraste tu directorio de inicio y todas las subcarpetas!.

Cuando escribes un comando con un espacio como primer carácter es posible que no termine en el historial. Esto depende del valor de la variable $HISTCONTROL. Si la lista de sus valores incluyeignorar el espacio(oignorar ambos) las líneas que comienzan con un carácter de espacio no se guardan en la lista del historial. Entonces con sudo!! ejecutará el último comando anterior.

Puedes imaginar una situación similar con !sudo, ejecutará el último comando que comience con sudoregistrado en el historial, pero si el último que recuerdas comenzó con un espacio... ahora sabes que usarás otro.

Última nota: menos dramático es tu error más puede ser tortuoso porque puede pasar sin que te des cuenta... y correrás el riesgo de que te llamen a pagar todos los intereses de una factura que no recuerdas.


Actualización (Bash es genial):
Con versiones recientes de Bash es posible solucionar este comportamiento peligroso con el siguiente comando que sugiero poner en ~/.bashrcel archivo:

shopt -s histverify

De man bashpuedes leer

Si elhistverificarLa opción Shell está habilitada ylínea de lecturaesta siendo usado,las sustituciones del historial no se pasan inmediatamente al analizador de shell.En su lugar, la línea expandida se vuelve a cargar en el búfer de edición de línea de lectura para realizar modificaciones adicionales.

Así podrás leer, y modificar cuando sea necesario, el comando que ejecutarás.
Dado que no es la configuración predeterminada en muchas distribucionesTodavía tenemos que recordarlo cuando usamos otras cuentas.

Respuesta2

Aquí hay algunas combinaciones de teclado comunes que usan muchos programas de Mac y Linux (aunque no estoy seguro de cuáles siguen la mayoría de las aplicaciones de Windows):

  • CTRL-A- Llevar el cursor al principio de la línea actual.
  • CTRL-E- Llevar el cursor al final de la línea actual.
  • CTRL-Left- Mueve el cursor hacia atrás una palabra.
  • CTRL-Right- Mueve el cursor una palabra hacia adelante.

Respuesta3

Usar

sudo !!

Será !!reemplazado por el comando anterior completo.

Respuesta4

@WChargin tiene razón con respecto a !sudo, así que estoy cambiando mi respuesta...

sudo !!es la respuesta correcta, como muchos han dicho.

Por las dudas, pego aquí lo siguiente con respecto al historycomando y cómo !funciona. Espero que esto ayude.


El comando de historia

El comando de historial se puede utilizar para enumerar el registro de Bash de los comandos que ha escrito:

Este registro se llama "historial". Para acceder a él escriba:

history n 

Esto solo enumerará los últimos n comandos. Escriba "historial" (sin opciones) para ver la lista completa del historial.

También puedes escribir!npara ejecutar el comando número n. Usar!!para ejecutar el último comando que escribió.

!-nejecutará el comando n veces antes (en otras palabras!-1es equivalente a!!).

!stringejecutará el último comando comenzando con esa "cadena" y !?string?ejecutará el último comando que contiene la palabra "cadena". Por ejemplo:

!cdVolverá a ejecutar el comando que escribió por última vez comenzando con "cd".

commandName !*ejecutará el "nombre del comando" con cualquier argumento que haya utilizado en su último comando. Esto puede resultar útil si comete un error ortográfico, por ejemplo. Si escribiste:

emasc /home/fred/mywork.java /tmp/testme.java 

En un intento de ejecutar emacs en los dos archivos anteriores, esto obviamente fallará. Entonces lo que puedes hacer es escribir:

emacs !* 

Esto ejecutará emacs con los argumentos que usted escribió por última vez en la línea de comandos. En otras palabras, esto equivale a escribir:

emacs /home/fred/mywork.java /tmp/testme.java

~La historia de la línea de comandos

información relacionada