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?

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


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


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"

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


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"

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 #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.