Nos sistemas UNIX, você pode pressionar as setas superior e inferior para navegar pelos comandos anteriores. Isso é extremamente útil.
Às vezes, 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 faça o check-in history
.
Existe alguma maneira de "desfazer" as alterações no comando no histórico acessado por meio de chaves?
Minha solução atual é acrescentar #
a ao comando. Dessa forma, o comando atual é executado como um comentário, para que nada aconteça. Então, 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, pois posso não me lembrar exatamente o que estava procurando.
Exemplo
Digitei o seguinte "50 comandos atrás":
ls -l /etc/httpd/conf/
Agora fui até essa linha e mudei para
ls -l /etc/init.d/
mas não pressione enter. Agora, quero voltar ao ls -l /etc/httpd/conf/
assunto.
Meu ambiente
$ echo $SHELL
/bin/bash
$ echo $TERM
xterm
fonte
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.ksh
o comportamento de difere aqui, ao que parece. E as opções de edição do seu histórico também dependem do modo de edição escolhido. Noksh
modo vi, por exemplo, a entrada antiga não é substituída e também posso emitir um comando desfazer, como emvi
, com 'u'.ksh
, mas é bom saber que isso existe lá.Respostas:
Desde que você tenha editado uma entrada do histórico, mas Enterainda não tenha pressionado , para voltar à entrada original, pressione repetidamente Ctrl+ _- o
undo
comando - até que não faça mais alterações. Você voltou à entrada original.fonte
Reverta ao comando original quando tiver feito várias alterações na linha:
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 apenasgrep
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 paragrep
: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
onden
está o número do índice. Neste exemplo, a execução!2065
será expandida parals -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çãoman 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.Exemplo:
Os comandos mais recentes agora mostrarão:
O exemplo acima também explica como usar
sed
para substituir uma sequência em um designador de evento.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.
fonte