Reverta ao comando original quando tiver feito várias alterações na 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-chave, que é altrpara mim.
Informações gratuitas, mas úteis
Quando você ter executado um comando como OP tinha feito anteriormente (isso acontece), não há nada para "desfazer", porque os comandos são tratados e lembrado pelo GNU Readline biblioteca e são não escrito para$HISTFILE
até as saídas de fachada. A razão de eu falar isso é porque você pode não 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ê role de volta através de todos os comandos de linha de leitura anteriores.
Se você se lembrar de alguns dos comandos , pressione ctrl+ re digite o que você lembra para pesquisar nos comandos anteriores que contêm essa sequência. Pressionar ctrl+ rnovamente exibirá a próxima mais recente, pesquisando para trás.
Por exemplo, digite ls -l
em seguida, ctrl+ rtantas vezes quanto for preciso para encontrar o comando anterior que você procura. Se você passar o mouse, ctrl+ sprocurará a partir da posição atual.
O fc
comando bash builtin é útil para listar os números de índice juntamente com os 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 ls -l
comando anterior , ele poderá canalizar a saída para grep
:fc -l -100 | grep 'ls -l'
Isso deve gerar uma lista de ls -l
comandos anteriores precedidos por um número de índice. A saída é assim:
2065 ls -l
Agora você pode usar o designador de evento !n
onde n
está o número do índice. Neste exemplo, a execução !2065
será expandida para ls -l
.
Embora isso não ajude após o fato, qualquer pessoa que queira preservar o histórico recente de comandos ao modificar comandos anteriores deve ver a HISTORY EXPANSION
seção man bash
. Aqui estão alguns métodos alternativos para modificar comandos antigos sem substituir o histórico.
A Event Designators
seção mostra como você pode editar facilmente a sequência 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 mostrarão:
echo foo
echo bar
O exemplo acima também explica como usar sed
para substituir uma sequência em um designador de evento.
!-n Refer to the current command minus n.
Portanto, se houver 3 comandos no histórico echo foo
, você usaria:
!-3:s/foo/bar
Observe que os designadores de eventos aparecerão no 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 lá fora, como parece intimamente relacionado, mesmo que seja mais um "não faça" do que a solução "desfazer" que o OP está procurando.
ksh
exemplo, você pode editar entradas do histórico e invocá-las sem excluir a "versão anterior" da entrada; você tem todos os comandos chamados disponíveis.