você pode usar a pesquisa inversa (control-r se o modo de edição estiver definido como emacs, que é o padrão) e funciona com espaço.
Eu sei sobre o recurso bash! text, que executa o último comando começando com "text". Mas parece não funcionar, quando "texto" contém espaço. Às vezes é útil procurar por algo, contendo espaços.
por exemplo:
history | grep ping
514 ping 192.168.100.2
515 ping 192.168.100.3
516 ping 192.168.100.4
517 ping google.com
518 ping 192.168.100.5
519 ping 192.168.100.6
520 ping 192.168.100.7
Eu quero ligar para a linha "ping google.com", usando o! característica. Eu tentei algumas coisas, mas elas falharam:
este é o comportamento padrão, ele executa o último comando ping
/root# !ping
ping 192.168.100.7
Uma string simples com espaço depois! não funciona
/root# !ping google
ping 192.168.100.7 google
Como eu sei, as citações dizem ao bash para interpretar uma string com espaço como uma única string, em vez de duas strings separadas. Mas aqui não funciona como esperado.
/root# !"ping google"
bash: !"ping: event not found
/root# !'ping google'
bash: !'ping: event not found
/root# "!ping google"
"ping 192.168.100.7 google google"
/root# '!ping google'
bash: !ping google: command not found
/root# !\"ping google\"
bash: !\"ping: event not found
/root# !(ping google)
bash: !: event not found
Isso chama o comando, mas chamará o último comando, contendo a string. Eu quero apenas comandos, começando com "ping"
/root# !?google
ping google.com
É possível fazer o que eu quero?
Posso pensar em algumas maneiras:
Use ?
. O seguinte é de man history
:
!?string[?]
Refer to the most recent command preceding the
current postition in the history list contain‐
ing string. The trailing ? may be omitted if
string is followed immediately by a newline.
Então, você deve conseguir fazer isso:
!?ping google?
Use o recurso de pesquisa inversa. Pressione Ctrl R e comece a digitar ping google
. Pressione Enter quando o comando relevante for encontrado.