colocar o comando history na linha de comando sem executá-lo

57

Eu uso! N onde (n) é o número da linha para executar uma linha no arquivo de histórico que eu quero que seja executado no prompt de comando, que eu encontro através do histórico | menos.

Mas há um evento do histórico da linha de comando que desejo modificar manualmente. Como posso inserir na linha de comando o conteúdo de um histórico sem que ele realmente seja executado para que eu possa modificar e pressionar retornar?

melhor,

Vass
fonte

Respostas:

71

Para solicitar que o comando seja impresso em vez de executado após a substituição do histórico, adicione o :p modificador , por exemplo !42:p. O comando resultante também será inserido no histórico, para que você possa pressionar Uppara editá-lo.

Se você tiver a histverify opção set ( shopt -s histverify), sempre terá a oportunidade de editar o resultado das substituições do histórico.

O fcbuiltin fornece acesso limitado à expansão do histórico (sem designadores de palavras) e permite editar um comando anterior em um editor externo.

Você pode usar !prefixpara se referir ao último comando que começa com prefixe !?substringao último comando que começa com substring. Quando você sabe o que está procurando, isso pode economizar muito tempo history | less.

Outra maneira de pesquisar no histórico anterior é a pesquisa incremental: pressione Ctrl+ Re comece a inserir uma substring do que você está procurando. Pressione Ctrl+ Rpara ir para a ocorrência anterior da sequência de pesquisa até agora e Ctrl+ Sse você foi longe demais. A maioria dos outros do que as teclas Ctrl+ R, Ctrl+ S, Backspacee personagens comuns terminar a pesquisa incremental e têm seu efeito habitual (por exemplo, teclas de setas para mover o cursor na linha que você alcançou, Enterpara executar o comando).

Gilles 'SO- parar de ser mau'
fonte
Existe um erro de digitação no seu primeiro exemplo ... #
1515
9
Você precisará fazer stty -ixonantes que Ctrl-s funcione.
Dennis Williamson
@ Dennis: Uau, modernos emuladores de terminal não fazem isso por padrão? <test> Você está certo, até o terminal gnome no Ubuntu tem controle de fluxo!
Gilles 'SO- stop be evil'
Não sei por que eles ainda o fazem. É impossível pegar algo enquanto está rolando. Quando você pressiona Ctrl-s, você recebe um prompt novamente. E conexões seriais lentas são principalmente coisa do passado.
Dennis Williamson
@ O argumento de Dennis Ctrl-sé importante, caso contrário, a pessoa fica presa como eu .
IMZ - Ivan Zakharyaschev
15

Outro pequeno: Alt+#

comenta a linha atual e a move para o buffer do histórico.

Portanto, quando você monta uma linha de comando e precisa emitir um comando provisório para, por exemplo, encontrar um arquivo, basta pressionar Alt+ #, emitir o outro comando, subir no histórico, descomentar e prosseguir.

Rahul Patil
fonte
2
Além disso Esc, #trabalha
Steven Penny
e você pode realmente escrevê-lo em um Mac (shift espera, pressione ESC e # juntos), ao contrário dos outros combinação ket (fn + alt + shift + #) ;-)
0xF2
7

Você pode usar o espaço mágico para expandir a história antes de pressionar Enter. No seu .inputrc, mapeie o espaço para o espaço mágico:

$if Bash
     Space: magic-space
$endif

Agora, sempre que você digitar um espaço após uma especificação de histórico, ele será imediatamente expandido - útil se você quiser editá-lo também!

Cascabel
fonte
7

Dê uma olhada no history-expand-linecomando, vinculado Alt+^por padrão. Ele expandirá a linha no local, que você poderá editar.

Alex Barrett
fonte
4

Usando Ctrl+rvocê pode pesquisar o histórico:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

Qualquer comando encontrado pode ser editado ...


Acho que encontrei exatamente o que você precisa: execute shopt -s histverifye na próxima vez em que você quiser usar o !ncomando não será executado, mas apenas colocado na linha de comando ...

pbm
fonte
Você precisa executar um comando antes que ele possa ser pesquisado com Ctrl + r, não o que Vass está pedindo.
phunehehe
11
Eu não entendo como isso não faz o que ele pede. Eu acrescentaria que, se você deseja editar o comando antes de executá-lo, basta pressionar TAB depois de encontrar o comando certo.
Steven D
2
Portanto, o procedimento seria: (1) Ctrl + r, (2) digite até encontrar o comando, (3) TAB, (4) comando de edição, (5) ENTER.
Steven D
11
@phuenhehe: "Mas não é um evento de linha de histórico de comandos que deseja modificar manualmente"
PBM
11
Não vai !n:pfuncionar?
alex
1

Eu sempre quis isso. Quando usei csh (e tcsh), tive um idioma:
!:88*:p

Esse idioma insere "palavra 88 até a última palavra" do comando anterior no ponto em que você está digitando na linha de comando atual, que geralmente é o fim. No csh, não é um erro que essa expressão não produza palavras. Ou seja, não precisa haver uma palavra 88, nem nenhuma que a segue. Se não houver palavra 88, isso não adiciona palavras ao final do comando que está sendo digitado e empurra a linha de comando resultante para o histórico sem execução.

Como você provavelmente sabe,
*! (como !! e! -1) é o comando anterior;
*: 88 é a palavra 88 (a primeira palavra - normalmente o comando - é zero) e o csh exigiria a existência dessa palavra, mas ...
*: 88 * são todas as palavras que começam na palavra 88 e, em seguida, csh não exigir que a palavra exista;
*: p significa imprimir, mas não executa a linha de comando.
Com ou sem o: p, a linha de comandos é adicionada ao histórico de comandos.

"Por que 88?" você se pergunta? Porque é a mesma chave que * preciso. Se você possui comandos por tanto tempo, talvez!: 888 *: p é o que você precisa. Lamentamos, mas isso não funciona com o bash AFAIK. Bash dirá apenas bash: :88*: bad word specifier

Curiosidade: seu comando geralmente não precisa ser o primeiro.
> /tmp/foo echo My command is word 3
é válido no bash e no csh.

W Dean Stanton
fonte
Como a pergunta está marcada para bash, pode ser bom começar dizendo que sua solução funciona apenas no (t) csh.
zagrimsan
0

Eu normalmente uso Ctrl+ rpara pesquisar e depois Ctrl+ epara ir para o final da linha sem executar.

nikc
fonte
já mencionado
Jeff Schaller
@JeffSchaller Eu não estou vendo isso. Eu vejo a referência CTRL + R. Em nenhum lugar onde eu vejo o CTRL + E, que é a peça que faltava no quebra-cabeça, nas postagens acima.
Nikc