¿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?

MattLBeck
fuente

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.]

camh
fuente
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
2
Significa "comando de arreglo". gnu.org/software/bash/manual/bashref.html#Bash-History-Builtins
Mikel
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"
Glenn Jackman
fuente
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

ryanbraganza
fuente
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"
stringbasic
fuente
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