Como posso salvar o último comando em um arquivo?

27

Quando estou executando minhas análises usando o bash shell, muitas vezes eu quero salvar os comandos que usei que me deram bons resultados para um arquivo no mesmo diretório (meu "LOGBOOK", como é chamado) para que eu pode verificar o que eu fiz para obter esses resultados. Até agora isso significou que eu copiasse o comando do terminal ou pressionasse "up" modificando o comando para um echo"my command" >> LOGBOOK , ou outras artimanhas similares.

Descobri que havia uma ferramenta history 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 como getlast >> LOGBOOK .

Existe uma maneira fácil de fazer isso? Alternativamente, como os outros lidam com salvar os comandos para os resultados que eles têm?

    
por MattLBeck 07.05.2012 / 11:59

4 respostas

35

Se você estiver usando bash , pode usar o comando fc para exibir seu histórico da maneira que deseja:

fc -ln -1

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

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

Isso deve funcionar como você fez em sua pergunta.

Eu adicionei uma pequena variação adicionando "$1" "$1" ao comando fc . Isso permitirá que você diga, por exemplo, getlast mycommand para imprimir a última linha de comando invocando mycommand , portanto, se você esqueceu de salvar antes de executar outro comando, ainda é possível salvar facilmente a última instância de um comando. Se você não passar um argumento para getlast (ou seja, invocar fc as fc -ln "" "" , ele imprimirá apenas o último comando).

[Nota: Resposta editada para explicar o comentário de @Bram e a questão mencionada na resposta de @glenn jackman.]

    
por 07.05.2012 / 12:16
8

Um problema com a resposta de @ camh é se você tem um comando que abrange múltiplas linhas, ele mostra apenas a primeira linha:

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

$ fc -lnr | head -1
         echo "one

Tente isto:

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

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

$ getlast
         echo "one
two
three"
    
por 07.05.2012 / 17:12
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: isso não cita o texto literal

    
por 08.05.2012 / 01:58
0

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

$> history -a LOGBOOK

Isto irá anexar todos os seus comandos da sessão atual para esse arquivo, você também pode adicionar um alias em seu arquivo ~ / .bashrc para fazer isso com um único comando:

$> alias getlast="history -a LOGBOOK"
    
por 07.05.2012 / 12:11