Parece haver muitas informações sobre como editar e executar um comando usando o seu editor usando "editar e executar o comando (Cx Ce)", mas o que eu gostaria de obter é usar o comando shell atual, aplique determinada filtragem (usando um script) e, em seguida, retorne-a para solicitar mais aprovação / alterações manuais antes da execução. Isso é possível com o bash?
13
edit-and-execute-command
.Escape
+V
, mas ainda vai executar o comando. Quanto à solução alternativa, eu adicionariaecho
na frente para executá-lo imprimindo o comando no console para revisão.Respostas:
Última atualização em minha experiência
A parte
0"+y$dd
do mapeamento a seguir é realmente algo em que você deve pensar cuidadosamente e adaptá-lo ao seu gosto / fluxo de trabalho / experiência.Por exemplo, com muita frequência me vi terminando com várias linhas no buffer, onde só quero executar a linha em que o cursor está; neste caso, eu posso usar em
0"+y$dd:%d<CR>
vez de0"+y$dd
.E este é apenas um dos cenários possíveis.
Resposta final para quem gosta
vim
vim
como seuEDITOR
/VISUAL
, para que, ao editar uma linha de comando, você a utilizevim
para editá-la.au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
seu~/.vimrc
arquivo no mapa Leaderd(que você raramente usará ao editar um comando) para a ação "exclua a linha atual no+
registro sem a EOL à direita".+
ou o*
registro no mapeamento acima; as maneiras de colar no terminal provavelmente serão diferentes; você precisa da+clipboard
opção para que esses registros estejam disponíveis .vim
editor, pressione EscapeLeaderd.Resposta original
Costumo fazer o mesmo e faço o seguinte. (Normalmente eu uso o
set -o vi
inbash
, então os pontos 1 e 2 a seguir são diferentes se você usarset -o emacs
o padrão; com base na sua pergunta, parece que os pontos 1 e 2 estão unificados em Ctrl+ xseguido por Ctrl+ e, que é mais difícil de digitar, imho .)(É aqui que você faz a pergunta.)
URxvt
.Claramente, isso é apenas uma solução alternativa, consistindo em copiar o comando editado na área de transferência antes de excluir o comando inteiro, para que nada seja executado ao sair do editor; no entanto, é o melhor que posso obter para mim.
Atualizar
Como meu
EDITOR
(eVISUAL
) é igual avim
, quando edito o comando, edito-o emvim
.A esse respeito, notei que o buffer é nomeado
/tmp/bash-fc.random
, onderandom
é uma sequência aleatória alfanumérica de 6 caracteres.Isso abre espaço para muitas possibilidades, se você usar
vim
como seu editor, pois poderá definir alguns mapeamentos.vimrc
para executar a sequência inteira Escape0"+y$dd:wq. Por exemplo, um comando que você raramente usaria ao editar uma linha de comando é Leaderd; portanto, você pode colocar o seguintemap
ping no seu.vimrc
arquivopara que o passo 4 da receita acima se torne
fonte
Não é possível fazer isso no Bash / readline, mas é possível no zsh usando o
edit-command-line
comando:Agora pressione Control- x Control- epara abrir o editor, editar a linha, sair do editor - você verá a linha de comando atualizada, mas ela não será executada automaticamente.
fonte
Agora que penso sobre isso, talvez uma variação do que o @kenorb sugeriu em um comentário seja a melhor solução alternativa (como parece que não existe solução), se quisermos continuar
bash
.O que você pode fazer é acrescentar um
#
(o caractere de comentáriobash
) ao comando, em vez deecho
. Então, quando você sair do exitor, o comando será ineficaz e você precisará apenas pressionar arrow up(ou k, se você usarset -o vi
), remover#
e confirmar.Observe que essa estratégia adiciona apenas algumas teclas, para que possa ser bastante eficiente, dependendo do seu nível de digitação.
fonte
Essas peças podem aproximá-lo:
a) substitua a ligação normal pela nova linha nova (ctrl-M)
bind -x '"\C-M":date"
b) pegue a linha atual do histórico usando
!#
substitua a data pelo script que desejar.
c) editar manualmente
d) se necessário, de alguma forma, amarre o
!!:p
que imprime o novo comando na linha de comando, mas não o executa, permitindo a edição manual.e) usando o comando ctrl-J submit editado em vez de uma nova linha
ou eles não podem ....
fonte
Existe uma opção no bash para modificar o comando do histórico sem executá-lo. Não sei se é possível usar o script para isso, não parece provável. Embora você possa fazer modificações usando modificadores de histórico.
Aqui está como fica:
fonte
Gostaria de apontar para o quadro de composição do Bash (não sou afiliado a ele): https://github.com/erichs/composure
Ele fornece
draft
erevise
funções que parecem ajudar no que você está tentando fazer. Aqui está uma citação (longa) do arquivo leia-me do projeto:fonte
Não parece possível com um atalho de teclado, pelo menos:
fonte