¿Cómo puedo guardar el último comando en un archivo?


29

Cuando estoy ejecutando mis análisis usando el shell bash, a menudo quiero guardar los comandos que he usado que me dieron buenos resultados en un archivo en el mismo directorio (mi "LOGBOOK", como se llama) para que pueda verificar qué Lo hice para obtener esos resultados. Hasta ahora esto me ha significado copiar o pasar el comando desde el terminal o presionar "arriba" modificando el comando a una echo"my command" >> LOGBOOKu otras travesuras similares.

Descubrí que había una historyherramienta el otro día, pero no puedo encontrar una manera de usarla para obtener el comando ejecutado previamente para poder hacer algo como eso getlast >> LOGBOOK.

¿Hay alguna manera fácil de hacer esto? Alternativamente, ¿cómo tratan los demás guardar los comandos para obtener los resultados que tienen?

Respuestas:


37

Si está usando bash, puede usar el fccomando para mostrar su historial de la manera que desee:

fc -ln -1

Eso imprimirá tu último comando. -lsignifica lista, -nsignifica no prefijar líneas con números de comando y -1dice mostrar solo el último comando. Si el espacio en blanco al comienzo de la línea (solo la primera línea en los comandos de varias líneas) es molesto, puede deshacerse de él fácilmente sed. Conviértalo en una función de shell y tendrá una solución según lo solicitado ( getlast >> LOGBOOK):

getlast() {
    fc -ln "$1" "$1" | sed '1s/^[[:space:]]*//'
}

Eso debería funcionar como lo ha pedido en su pregunta.

He agregado una ligera variación al agregar "$1" "$1"al fccomando. Esto le permitirá decir, por ejemplo, getlast mycommandimprimir la última invocación de línea de comando mycommand, por lo que si olvidó guardar antes de ejecutar otro comando, aún puede guardar fácilmente la última instancia de un comando. Si no pasa un argumento a getlast(es decir, invocar fccomo fc -ln "" "", imprime solo el último comando).

[Nota: Respuesta editada para dar cuenta del comentario de @ Bram y el problema mencionado en la respuesta de @glenn jackman.]


55
La primera forma fc -lnr | head -n 1se puede abreviar fc -lnr -1.
Bram

@Bram: Buenas cosas. Estaba usando help fcpara mi documentación. La página de manual de bash tiene más detalles, incluido el uso de índices negativos. Eliminar heades bueno porque el único comando restante está incorporado, por lo que ahora no hay fork / exec.
camh

1
Me pregunto por qué se llama el comando fc...
imz - Ivan Zakharyaschev


9

Un problema con la respuesta de @ camh es que si tiene un comando que abarca varias líneas, solo muestra la primera línea:

$ echo "one
> two
> three"
one
two
three

$ fc -lnr | head -1
         echo "one

Prueba esto:

$ alias getlast='fc -nl $((HISTCMD - 1))'

$ echo "one
> two
> three"
one
two
three

$ getlast
         echo "one
two
three"

3
permitiendo cmdhist lo arreglará: "Si está configurado, bash intenta guardar todas las líneas de un comando de varias líneas en la misma entrada del historial. Esto permite una fácil edición de los comandos de varias líneas".
Mark McKinstry

2

En lugar de usar la flecha hacia arriba, puede usar "!!"para referirse al comando anterior.

p.ej

$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK

nota: esto no cita el texto literal


55
Eso no capturará el comando literal. Si hay metacaracteres de shell, serán evaluados y sustituidos. Las tuberías también se romperán: ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK.
camh

0

Puede hacerlo con el siguiente comando si está utilizando bash shell:

$> history -a LOGBOOK

Esto agregará todos sus comandos de la sesión actual a ese archivo, también puede agregar un alias en su archivo ~ / .bashrc para hacer esto con un solo comando:

$> alias getlast="history -a LOGBOOK"

1
Pero te estás perdiendo el requisito más importante de que solo guardo los comandos que funcionaron y obtuve los resultados que tengo. No quiero guardar todos los comandos recientes que he hecho, solo seleccione los que haya usado. Gracias de cualquier manera.
MattLBeck
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.