Executando um subshell no meio do comando atual

16

Eu frequentemente me encontro nesse cenário. Estou no meio de digitar um comando e preciso verificar outra coisa antes de concluí-lo.

Existe uma maneira de abrir um subshell de algum tipo com a minha entrada atual sendo lembrada até agora, então quando eu sair desse subshell, volto para onde estava?

$ mylongcommand -n -e <SOME KEY COMBINATION WHICH OPENS A SUBSHELL>
$ date
...
$ exit
$ mylongcommand -n -e <BACK TO WHERE I WAS>

estou a usar zsh

Panayiotis
fonte
2
Por que não apenas abrir outra janela do terminal?
Barmar
@ Barmar Para mim, eu não uso uma GUI na maioria dos meus sistemas Linux, então eu teria que mudar de TTY. O que significa que tenho que me autenticar novamente. As opções abaixo são muito mais eficientes.
Zachary Brady
3
Você pode usar screenou tmuxobter vários terminais virtuais no console.
Barmar

Respostas:

16

Existe a combinação de teclas EscQque salva o buffer de comando e permite inserir um novo comando. Depois de executar o comando, o buffer contém o que você digitou antes. Se você precisar executar outro comando antes de terminar, digite EscQnovamente.

(Eu não tentei abrir um subshell depois de pressionar EscQainda.)

Veja http://zsh.sourceforge.net/Intro/intro_10.html e procure por "esc-q"

Bodo
fonte
Era exatamente isso que eu queria, muito obrigado! Eu poderia fazê-lo executar um shell aninhado em vez de retornar imediatamente, mas para o meu caso de uso, retornar imediatamente funciona perfeitamente.
Panayiotis
7

Minha solução para isso é decididamente low-tech e desajeitado, mas depende de-chave seqüências você provavelmente já está familiarizado com: Hit Ctrl+ A, então #, então ENTER.

Isso tem o efeito de inserir um #no início da linha, tornando-o um comentário e, em seguida, executando-o, empurrando-o para o histórico de comandos. Em seguida, você pode inserir seu comando auxiliar e, em seguida, percorrer o histórico de comandos até o comando comentado, remover #e concluir o comando conforme necessário.

Trauma Digital
fonte
Você deve pressionar o botão "home" do seu teclado, ele salva um keypress, e a energia necessária para realmente pressioná-lo
Ferrybig
@Ferrybig - sim, isso é bom, embora o meu teclado do dia-a-dia seja um MacBook Pro que não tenha uma tecla HOME . O equivalente HOME é FN + SETA ESQUERDA , mas que rola até a parte superior do terminal.
Digital Trauma
2

Digite Ctrl+ Zpara "suspender" o comando que estou digitando e digite outro comando. Depois de executar esse comando (ou abortá-lo com Ctrl+ C), o comando suspenso volta para edição (mesmo lembrando a posição do cursor). Como conveniência adicional, se a linha de comando estiver vazia quando eu digitar Ctrl+ Z, a tecla chamará o interno bg(portanto, um duplo Ctrl+ Zenvia um comando em execução diretamente para o plano de fundo).

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

(Anteriormente afixado em Lembre-se um comando digitado-metade enquanto eu verificar algo que principalmente tem soluções para bash, onde você não pode fazer algo tão conveniente. Esta é uma versão ligeiramente mais extravagante do built-in de ligação de M-qparapush-line .)

Isso não executa um subshell: o comando que você digita após “suspender” o anterior é executado no mesmo shell. Isso permite fazer coisas como alterar o diretório atual, se você perceber, depois de digitar um comando, que pretendia executá-lo em um diretório diferente. Se você deseja executar uma nova instância do shell, pode executar a zshpartir de uma ligação de chave, mas não acho que seja particularmente útil.

Gilles 'SO- parar de ser mau'
fonte