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.