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

50

Eu uso! n onde (n) é o número da linha para executar uma linha no arquivo de histórico que eu quero executar no prompt de comando que eu encontro via history | less.

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

Melhor,

    
por Vass 15.11.2010 / 15:34

7 respostas

61

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 %código%. O comando resultante também será inserido no histórico, então você pode pressionar Up para editá-lo.

Se você tem a opção !42:p definida ( histverify ), você sempre terá a oportunidade de editar o resultado das substituições de histórico.

O shopt -s histverify builtin dá acesso limitado à expansão do histórico (sem designadores de palavras) e permite editar um comando anterior em um editor externo.

Você pode usar fc para se referir ao último comando que começa com !prefix e prefix para se referir ao último comando que começa com !?substring . Quando você sabe o que está procurando, isso pode economizar muito tempo em relação a substring .

Outra maneira de pesquisar através do histórico anterior é a busca incremental: pressione Ctrl + R e comece a inserir uma substring do que você está procurando. Pressione Ctrl + R para ir para a ocorrência anterior da string de busca até agora e Ctrl + S se você já foi longe demais. A maioria das teclas diferentes de Ctrl + R , Ctrl + S , Backspace e normal caracteres terminam a busca incremental e têm seu efeito usual (por exemplo, teclas de seta para mover o cursor na linha que você alcançou, Enter para executar o comando).

    
por 15.11.2010 / 21:19
14

Outra pequena: Alt + #

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

Então, quando você está montando uma linha de comando e precisa emitir um comando provisório para, por exemplo, encontrar um arquivo, você acabou de pressionar alt + #, emitir o outro comando, subir no histórico, descomentar e continuar.

    
por 10.06.2013 / 08:19
6

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

    
por 17.11.2010 / 13:09
5

Você pode usar o espaço mágico para expandir o histórico antes de pressionar Enter. Em 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 depois de uma especificação de histórico, ele será imediatamente expandido - útil se você quiser editá-lo também!

    
por 16.11.2010 / 04:41
4

Usando Ctrl+r , você pode pesquisar o histórico:

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

Qualquer comando encontrado pode ser editado ...

Eu acho que encontrei exatamente o que você precisa: execute shopt -s histverify e na próxima vez que você quiser usar o comando !n , ele não será executado, mas apenas colocado na linha de comando ...

    
por 15.11.2010 / 16:49
1

Eu sempre quis isso. Quando usei csh (e tcsh), tive uma expressão: !:88*:p

Essa expressão insere "palavra 88 até a última palavra" do comando anterior no ponto em que você está digitando na linha de comando atual, que normalmente é o fim. Em csh, não é um erro que tal expressão não produza palavras. Isto é, não precisa haver uma palavra 88, nem nenhuma que a siga. Se não houver palavra 88, isso não adiciona palavras ao final do comando que está sendo digitado e, em seguida, envia 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 csh exigiria que tal palavra existisse, mas ...
*: 88 * é todas as palavras que começam na palavra 88 e, em seguida, csh não requer que a palavra exista; *: p significa imprimir, mas não executa a linha de comando.
Com ou sem o: p, a linha de comando é adicionada ao histórico de comandos.

"Por que 88?" você se pergunta? Porque é a mesma chave que eu vou precisar. Se você tiver comandos por muito tempo, talvez!: 888 *: p é o que você precisa. Desculpe, isso não funciona com o AFAIK bash. 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 em bash e csh.

    
por 31.07.2017 / 04:06
0

Eu normalmente uso Ctrl + r para procurar e então Ctrl + e para ir até o final a linha sem executar.

    
por 26.01.2018 / 01:17