Como desfazer mudanças no histórico de comandos?

10

Nos sistemas UNIX, você pode pressionar as setas superior e inferior para navegar pelos comandos anteriores. Isso é extremamente útil.

Às vezes, eu subo e encontro um comando que quero usar novamente, mas com algumas variações. Se eu fizer essas alterações, não tenho como recuperar o comando original, a menos que eu verifique em history .

Existe alguma maneira de "desfazer" as alterações no comando no histórico acessado por meio de chaves?

Minha solução atual é prefixar um # no comando. Desta forma, o comando atual é executado como um comentário, então nada acontece. Então, eu posso navegar novamente pelos comandos com as teclas. O problema é que o comando que eu estava usando pode ser muito distante na lista, então subir novamente duzentas vezes é um pouco. Control + R também não é uma solução, já que posso não lembrar exatamente o que estava procurando.

Exemplo

Eu digitei os seguintes "50 comandos atrás":

ls -l /etc/httpd/conf/

Agora eu fui até a linha e mudei para

ls -l /etc/init.d/

mas não pressionou enter. Agora quero voltar para o ls -l /etc/httpd/conf/ .

Meu ambiente

$ echo $SHELL
/bin/bash
$ echo $TERM
xterm
    
por fedorqui 30.04.2015 / 12:41

3 respostas

7

Contanto que você tenha editado uma entrada de histórico, mas não pressionado Entre ainda, para voltar à entrada original, pressione Ctrl + _ < - o comando undo - até que não faça nenhuma alteração adicional. Você está de volta à entrada original.

    
por 01.05.2015 / 01:09
4

Reverter para o comando original quando tiver feito várias alterações para a linha:

revert-line (M-r) 
    Undo all changes made to this line. This is like 
executing the undo command enough times to get back to the beginning.

M é a meta key, que é altr para mim.

Informação gratuita e útil

Quando você tiver executado um comando como o OP já havia feito (acontece), não há nada para "desfazer" porque os comandos são manipulados e lembrados pelo GNU Readline e são não escrito em $HISTFILE até o shell sair. A razão pela qual eu mencionei isso é porque você não pode apenas grep o $HISTFILE como se poderia esperar e pode não ser ideal para sair do shell.

Então, aqui estão algumas opções para evitar que você volte para todos os comandos anteriores de linha de leitura.

Se você se lembrar de algum comando , pressione ctrl + r e digite o que você lembra de pesquisar através de comandos anteriores contendo essa cadeia. Pressionar ctrl + r novamente exibirá o próximo mais recente, procurando para trás.

Por exemplo, digite ls -l e ctrl + r quantas vezes forem necessárias para encontrar o comando anterior que você procura. Se você rolar para trás, ctrl + s irá procurar para frente a partir da posição atual.

O comando fc bash builtin é útil para listar os números do índice ao lado dos comandos readline anteriores.

fc -l -100 listará os 100 comandos anteriores na linha de leitura.

Além disso, se o OP souber que está procurando um comando ls -l anterior, ele poderá enviar a saída para grep , como: fc -l -100 | grep 'ls -l'

Isso deve exibir uma lista dos comandos anteriores ls -l precedidos por um número de índice. A saída é assim:
2065 ls -l

Agora você pode usar o designador de evento !n , em que n é o número do índice. Neste exemplo, a execução de !2065 será expandida para ls -l .

Embora isso não ajude após o fato, quem quiser preservar o histórico de comandos recentes ao modificar comandos anteriores, deverá ver a seção HISTORY EXPANSION de man bash . Aqui estão alguns métodos alternativos para modificar comandos antigos sem sobrescrever o histórico.

A seção Event Designators mostra como você pode editar facilmente a string do comando usado mais recentemente.

^string1^string2^
              Quick  substitution.  Repeat the previous command, replacing string1 with string2.  Equivalent to
              ''!!:s/string1/string2/'' (see Modifiers below).

Exemplo:

$ echo foo
foo 
$ ^foo^bar
echo bar
bar

Os comandos mais recentes agora serão exibidos:

echo foo
echo bar

O exemplo acima também explica como usar sed para substituir uma string em um designador de evento.

!-n    Refer to the current command minus n.

Portanto, se 3 comandos no histórico forem echo foo , você usaria:
!-3:s/foo/bar

Observe que os designadores de eventos aparecerão em seu histórico como o comando executado, neste caso echo bar . Não aparecerá no histórico como !-3:s/foo/bar .

Apenas lançando isso para fora, pois parece estar intimamente relacionado, mesmo que seja mais do que uma solução "não fazer" do que a solução "desfazer" que o OP está procurando.

    
por 01.05.2015 / 00:27
-1

Ao usar o bash, basta editar o arquivo .bash_history no seu diretório home

    
por 30.04.2015 / 16:46