Como posso salvar o último comando em um arquivo?

29

Quando estou executando minhas análises usando o shell bash, geralmente desejo salvar os comandos que usei que me deram bons resultados em um arquivo no mesmo diretório (meu "LOGBOOK", como é chamado) para que eu possa verificar o que Eu fiz para obter esses resultados. Até agora, isso significava que eu copiava o comando do terminal ou pressionava "para cima" modificando o comando para uma echo"my command" >> LOGBOOKou outras palhaçadas semelhantes.

Descobri que havia uma historyferramenta no outro dia, mas não consigo encontrar uma maneira de usá-la para obter o comando executado anteriormente, para que eu possa fazer algo assim getlast >> LOGBOOK.

Existe uma maneira fácil e agradável de fazer isso. Como alternativa, como os outros lidam com o salvamento dos comandos para obter os resultados obtidos?

MattLBeck
fonte

Respostas:

37

Se você estiver usando bash, poderá usar o fccomando para exibir seu histórico da maneira que desejar:

fc -ln -1

Isso imprimirá seu último comando. -lsignifica lista, -nsignifica não prefixar linhas com números de comando e -1diz para mostrar apenas o último comando. Se o espaço em branco no início da linha (apenas a primeira linha nos comandos de várias linhas) for incômodo, você poderá se livrar disso com facilidade sed. Transforme isso em uma função shell e você terá uma solução conforme solicitado ( getlast >> LOGBOOK):

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

Isso deve funcionar como você pediu na sua pergunta.

Eu adicionei uma ligeira variação adicionando "$1" "$1"ao fccomando. Isso permitirá que você diga, por exemplo, getlast mycommandpara imprimir a última chamada de linha de comando mycommand; portanto, se você esqueceu de salvar antes de executar outro comando, ainda poderá salvar facilmente a última instância de um comando. Se você não passar um argumento para getlast(por fcexemplo fc -ln "" "", invocar como , ele imprime apenas o último comando).

[Nota: resposta editada para dar conta do comentário de @ Bram e do problema mencionado na resposta de @glenn jackman.]

camh
fonte
5
O primeiro formulário fc -lnr | head -n 1pode ser abreviado para fc -lnr -1.
Bram
@Ram: coisas boas. Eu estava usando help fcpara a minha documentação. A página do manual do bash tem mais detalhes, incluindo esse uso de índices negativos. Eliminar headé bom porque o único comando restante é incorporado e agora não há fork / exec.
Camh
1
Eu me pergunto por que o comando é chamado fc...
IMZ - Ivan Zakharyaschev
2
Significa "comando de correção". gnu.org/software/bash/manual/bashref.html#Bash-History-Builtins
Mikel
9

Um problema com a resposta do @ camh é que se você possui um comando que abrange várias linhas, ele mostra apenas a primeira linha:

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

$ fc -lnr | head -1
         echo "one

Tente o seguinte:

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

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

$ getlast
         echo "one
two
three"
Glenn Jackman
fonte
3
a ativação cmdhistcorrigirá: "Se definido, o bash tenta salvar todas as linhas de um comando de várias linhas na mesma entrada do histórico. Isso permite reeditar facilmente os comandos de várias linhas".
Mark McKinstry
2

Em vez de usar a seta para cima, você pode usar "!!"para se referir ao comando anterior.

por exemplo

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

nota: isto não cita o texto literal

ryanbraganza
fonte
5
Isso não capturará o comando literal. Se houver algum metacaractere de shell, eles serão avaliados e substituídos. Os oleodutos também quebram: ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK.
camh
0

Você pode fazer isso com o seguinte comando se estiver usando o bash shell:

$> history -a LOGBOOK

Isso anexará todos os seus comandos da sessão atual a esse arquivo. Você também pode adicionar um alias ao seu arquivo ~ / .bashrc para fazer isso com um único comando:

$> alias getlast="history -a LOGBOOK"
stringbasic
fonte
1
Mas você está perdendo o requisito mais importante de que eu apenas salve os comandos que funcionaram e obtive os resultados que tenho. Não quero salvar todos os comandos recentes que fiz, basta selecionar aqueles depois de usá-los. Obrigado mesmo assim.
7898 MattelBeck #