store command antes de pressionar ctrl + c, revive depois [duplicate]

9

Às vezes eu digito um longo comando em meu prompt de comando e noto que preciso verificar algo antes de realmente pressionar return e executar o comando. Eu pressiono ctrl+c , executo o novo comando e, em seguida, escrevo o comando cancelado novamente e o executo.

Existe uma maneira de "salvar" o comando que eu devo cancelar com ctrl+c e restaurá-lo mais tarde quando eu terminar o comando "check something"?

Note que não quero abrir outro terminal, porque estou em um servidor remoto via ssh.

Shellshot:

$ git commit -am 'FOO-123: fix issue with dorks around bars'^C
$ git status
# On branch foo
modified: foo.php
$ git commit -am 'FOO-123: fix issue with dorks around bars'
1 file changed, 46 deletions(-)
$ 
    
por cweiske 20.03.2013 / 13:57

5 respostas

12

No Unix, você poderia usar o editor de linha de comando para tal coisa. Eu normalmente corro com set -o emacs para que eu possa usar as seguintes chaves Emacs diretamente na linha de comando:

  1. exiba sua linha de comando
  2. Ctrl-A - vai para o começo da linha de comando
  3. Ctrl-K - corta toda a linha de comando em um buffer interno
  4. ... faça todo o trabalho necessário aqui ...
  5. Ctrl-Y - colar o comando do buffer na linha de comando

Você também pode set -o vi e, em seguida, usar vi atalhos para esse tipo de coisa.

    
por 20.03.2013 / 14:15
4

Em vez de ctrl-c, vá para o começo da linha e faça isso:

$ history -s "git commit -am 'FOO-123: fix issue with dorks around bars'"

Pressione Enter. Não será executado, mas agora é a última linha da história. Não tenho certeza se isso é específico.

    
por 20.03.2013 / 14:19
4

O que sempre faço é colocar um marcador de comentário # na frente do comando. Mais tarde, posso recordar no histórico, remover o marcador de comentário e depois executar o comando.

    
por 20.03.2013 / 19:47
2

Prefira o nome de qualquer comando que não faça nada importante para o que você escreveu e execute a linha de comando resultante. Isso é ao longo das linhas da @ resposta do goldilocks , mas mais genérico.

Os exemplos seriam true , false e echo . Basta passar para o início da linha de comando e preceder o comando que preferir para o que você já escreveu.

$ true git commit -am 'FOO-123: fix issue with dorks around bars'
$

Como true é essencialmente um não operacional, o comando está agora no histórico (independentemente de qual shell você está usando, desde que tenha um histórico de comandos) e pode ser recuperado normalmente sempre que você estiver pronto , mas nada mais aconteceu. Quando estiver pronto, recupere o comando do histórico, volte ao início da linha de comando e remova o comando no-op antes de executá-lo.

A única desvantagem real disso é que você perde qualquer status de saída do comando anterior ( $? no bash-speak). Se você estiver fazendo mais do que uma simples chamada de comando (encadeando operações como ; , && e || , pipes, redirecionamento, ...) você pode precisar citar o comando antes de passá-lo para o comando no-op , então o shell não faz sua mágica em parte do comando. Algo como false && ( ... ) (com ... sendo o que você tinha antes) também pode funcionar; já que false retornará um resultado malsucedido, o shell nunca chegará ao restante da linha de comando.

Outra opção, especialmente se você estiver executando em um ambiente gráfico, é simplesmente abrir outra janela de terminal. Em um ambiente somente para CLI, o mesmo pode ser feito iniciando screen quando você efetua login - então você pode separar trivialmente a sessão atual e iniciar uma nova.

    
por 20.03.2013 / 14:44
0

Semelhante à sugestão de Goldilocks, vá para o início da linha (Ctrl-A com o comportamento do Emacs) e coloque o prefixo '#'. Isso vai transformar seu comando em um comentário em vez de executá-lo. Quaisquer truques que você usa para chamar comandos (como Ctrl-R ou histórico) serão capazes de recuperar o comando e então você pode ir para o início e remover o #.

    
por 20.03.2013 / 20:26