Obter um comando do histórico sem execução no bash

2

Para usar um comando do histórico, você pode escrever como $!100 . Mas às vezes eu faço uma pequena mudança no comando.

Existe uma maneira de obter um comando do histórico sem executá-lo.

Agora estou copiando e colado do histórico usando o mouse. Eu quero saber como fazer isso usando apenas o teclado.

    
por ironsand 23.07.2013 / 19:55

6 respostas

1

Executar

shopt -s histverify

Usando isso, você obterá a expansão do comando history e poderá editá-lo antes de executá-lo. Do manual :

If the histverify shell option is enabled, and Readline is being used, history substitutions are not immediately passed to the shell parser. Instead, the expanded line is reloaded into the Readline editing buffer for further modification.

Você pode colocar essa opção nos arquivos de configuração do Bash (por exemplo, ~/.bash_profile ou ~/.bashrc dependendo do qual você usa ) para ativá-lo automaticamente.

    
por 23.07.2013 / 20:19
3

No Bash, comece a digitar as primeiras letras do comando e, em seguida, pressione Ctrl + R para iniciar uma pesquisa de histórico. Você pode pressionar Ctrl + R para continuar pesquisando no histórico do Bash. Quando você encontrar o comando que deseja, use as teclas de seta para selecionar / navegar pelo comando para editar e executar de acordo com suas necessidades.

Você também pode pressionar Ctrl + R com um buffer de comando vazio e iniciar sua pesquisa a partir daí.

    
por 23.07.2013 / 20:21
2

Além da pesquisa de histórico via ctrl + r já mencionada, você pode usar o método do número de entrada do histórico com o qual já está familiarizado:

!<history entry number>

no meio de outros comandos, como

echo !100

e até mesmo argumentos de referência de comandos anteriores. Por exemplo, suponha que no meu histórico, a entrada 100 fosse:

ping google.com

Eu poderia fazer uma pesquisa de host no google puxando o primeiro argumento da entrada do histórico assim:

host !100:1

Isso funciona para a referência especial ao comando anterior

!!

também. É claro que, para as entradas numeradas, você precisa saber o número de entrada digitando o histórico e procurando, ou canalizando para o grep. Se você quiser puxar do seu histórico, combinando o texto, você pode usar o texto de um comando anterior no! declaração. Por exemplo, usando o fato de que eu tenho essa declaração ping google.com no meu histórico, posso referenciá-la como:

host !ping:1

O que se deve ter em mente com a pesquisa por método de texto é que ele pesquisa para trás e puxa a primeira correspondência.

    
por 23.07.2013 / 20:33
1

Você pode substituir qualquer sequência no comando anterior pelo operador ^^ . Não tenho certeza do que é chamado. Caso contrário (não último comando), use a sugestão de Garrett.

$ ping 10.3.0.3
PING 10.3.0.3 (10.3.0.3) 56(84) bytes of data.
64 bytes from 10.3.0.3: icmp_req=1 ttl=64 time=0.333 ms
64 bytes from 10.3.0.3: icmp_req=2 ttl=64 time=0.251 ms
^C
--- 10.3.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.251/0.292/0.333/0.041 ms

mágica aqui:

$ ^ping^finger
finger 10.3.0.3
The program 'finger' is currently not installed.  You can install it by typing:
apt-get install finger
    
por 23.07.2013 / 21:16
0

Você pode usar:

cat ~/.bash_history

... para ver as entradas no seu histórico bash. Se você está procurando por algo específico, canalize-o para grep e pesquisa. Por exemplo, se eu executar um comando chmod ao qual desejo me referir, poderei executá-lo:

cat ~/.bash_history | grep chmod

... para encontrar essas entradas. Espero que eu entendi sua pergunta corretamente.

    
por 23.07.2013 / 20:26
0

Is there a way to get a command from history without executing it?

Talvez eu esteja perdendo o ponto da pergunta, pois duvido que eu seja a única pessoa que saiba sobre :p . Significa "imprimir". Se você digitar !100:p , o shell irá imprimir (isto é, exibir) o comando # 100 sem executá-lo.

Se você não souber sobre os operadores : no histórico, deverá aprender. Como a “ilustração numérica” aponta , :n recupera a palavra n de um comando. Você também pode usar :n-m para obter um intervalo; e existem padrões interessantes. Por exemplo, :- (deixando n e m em branco) obtém todas as palavras, exceto a última. :$ te dá a última palavra. :h é “cabeça”, então se você digitar

ls -ld /asdfg/qwerty/foo/bar

então

!:- !$:h

se transforma em

ls –ld /asdfg/qwerty/foo

Ah, sim, !$ é a abreviação de !:$ . :s é substituto, como em :s/old/new/ . Isso é o mesmo que ^old^new^ , exceto para coisas como

  1. :s pode ser usado em qualquer comando (como em !100:s/... ); ^^ funciona apenas no comando mais recente.
  2. :s pode ser usado em palavras individuais ou em intervalos de palavras. Por exemplo,

    !:- !$:s/d/D/

    obtém

    ls -ld /asDfg/qwerty/foo/bar

    (em vez de ls -lD ... ).

  3. :s pode ser aplicado globalmente. A sintaxe não é intuitiva, mas, quando :s/old/new/ substitui a primeira ocorrência, :gs/old/new/ substitui todas as ocorrências.

Além disso, depois de obter um comando do histórico sem executá-lo (por exemplo, com !100:p ), possivelmente com modificações (como mostrado acima), Torna-se o comando mais recente na sua lista de histórico. Agora você pode pressionar ↑ (cursor para cima) e editá-lo.

    
por 07.08.2013 / 02:59

Tags