O envio de um aplicativo de primeiro plano para o segundo plano requer cooperação do terminal e do shell. O terminal não pode fazer isso sozinho, porque o shell precisa definir o grupo de processos em primeiro plano. O shell não pode fazer isso sozinho, porque o terminal tem que processar a tecla pressionada (o shell não está em primeiro plano, então ele não pode receber um pressionamento de tecla).
Uma boa aproximação é enviar o aplicativo para o fundo muito rápido. Afinal, um aplicativo compartilha o tempo de CPU com outros e uma pausa de alguns centésimos de segundo não importa. (Ele faz para aplicativos em tempo real, portanto, certifique-se de iniciá-los em segundo plano.) Eu uso uma ligação de shell para Ctrl + Z que envia o último trabalho em primeiro plano para o fundo. Dessa forma, pressionar Ctrl + Z Ctrl + Z envia uma tarefa para o segundo plano com o mínimo de tempo de suspensão. / p>
Esta é a minha ligação zsh, que também " Background "um comando meio digitado quando a linha de comando não está vazia .
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
Em inglês, para usuários não zsh no público:
-
Defina uma função de shell que faça o seguinte:
- Se o comprimento do buffer de entrada for 0, então colocar o trabalho atual (o trabalho que foi suspenso ou iniciado pela última vez) no plano de fundo e redisplay o aviso.
- Caso contrário, pressione o buffer de entrada em uma pilha e mostre um novo prompt. Uma vez que o usuário insere um comando ou o cancela com Ctrl + C , o buffer pressionado é trazido de volta para outra edição.
-
Vincule essa função a Ctrl + Z .
Se você quiser apenas o comportamento de segundo plano, independentemente de a linha de comando estar vazia:
function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_
Eu não sei se você pode fazer o mesmo no bash. Deve ser tão fácil quanto bind -x '"\C-z": bg'
, exceto que o bash deixa o caractere tty stop no lugar, então ele nunca recebe Ctrl + Z como entrada.