Terminal - como reiniciar a sessão após sair inadvertidamente?

22

Às vezes, saio inadvertidamente de uma sessão do Terminal (geralmente porque acho que estou conectado a um sistema remoto, quando não estou), então chego a esse ponto:

insira a descrição da imagem aqui

Como posso reiniciar a sessão neste momento? Não quero fechar a janela ou a guia porque tenho várias guias configuradas para o meu fluxo de trabalho normal; portanto, só quero que a sessão na guia atual volte a funcionar (ou seja, volte para um prompt do bash).

A única solução que encontrei até agora é sair do Terminal completamente e abri-lo novamente, mas isso está longe de ser ideal, pois obviamente interrompe tudo o que estou fazendo em outras janelas / guias do Terminal.

Paul R
fonte
1
Os emuladores de terminal Linux (KDE / Gnome) permitem reordenar as guias. Portanto, se você iniciar uma nova guia, poderá movê-la para substituir a que você fechou. O terminal do OS X não tem isso? (Eu não sou uma pessoa mac, apenas vi isso em "questões de rede quente".) Também gosto de usar a tela GNU para multiplexar muitas sessões de shell, em vez de abas em uma janela de terminal. Eu tenho outra guia com uma sessão de tela em outro computador. Às vezes eu abrir outro terminal se eu quero ver duas coisas ao mesmo tempo, mas normalmente eu gosto de ter minhas conchas numerada, a tela de maneira faz, em vez de apenas lá
Peter Cordes
1
De qualquer forma, eu sugeriria a tela (ou tmux, se você ainda não conhece a tela) para manter várias conchas no mesmo host em uma guia da GUI. Essa hierarquia de dois níveis de guias / janelas de tela permite ter muitas coisas abertas, sem perder o controle do que está onde. Além disso, como eu disse, ter números para os diferentes shells facilita a lembrança de qual número trocar ( ^t 8por exemplo) para um determinado contexto, em vez de contar visualmente em qual guia clicar ou (ou quantas ctrl-pgup devem ser atingidas) .
Peter Cordes
1
screen e tmux têm rolagem configurável dentro de cada janela da tela. Não me lembro de ter visto nada sobre como manter o scrollback no disco para persistência nas reinicializações! Isso é legal. Três guias é fácil o suficiente para acompanhar mentalmente. Normalmente, tenho algo como 10 na minha área de trabalho, pois faço quase tudo da linha de comando, não um navegador de arquivos da GUI. (reproduzindo vídeos / audiolivros etc.) Normalmente, tenho cerca de três shells cdeditados no código-fonte quando estou trabalhando no código, para que isso corresponda ao seu uso.
Peter Cordes
1
De qualquer forma, arrastar as guias ao redor deve facilitar a recuperação do fechamento acidental de uma guia, pois você pode colocá-la de volta para onde ela vai.
Peter Cordes
1
Eu não acho que muitas pessoas os usem localmente, para sessões de shell locais dentro de uma única guia do emulador de terminal. IDK, talvez outros viciados em linha de comando da velha escola também o façam. O principal caso de uso está em sshalgum lugar. Acostumei-me a usar a tela e a utilizá-la localmente e também em sessões remotas. Pelo que entendi, se você ainda não tem screenmemória muscular, aprenda tmux porque a tela é antiga e suja. Provavelmente eu poderia alternar para tmuxe configurá-lo para usar as mesmas teclas de atalho que eu uso screen, mas a tela ainda funciona bem para mim.
Peter Cordes

Respostas:

26

Neste ponto, não há como recuperar a guia. A sessão do terminal está fechada e não possui mais um TTY. Não há como referenciar a guia para fazer algo inteligente. Eu sugiro adicionar essa função ao seu .bashrc ou .profile para que você não tenha o problema no futuro:

exit() {
    read -t5 -n1 -p "Do you really wish to exit? [yN] " should_exit || should_exit=y
    case $should_exit in
        [Yy] ) builtin exit $1 ;;
        * ) printf "\n" ;;
    esac
}

ou, para aqueles de nós que usam o Z Shell (adicione-o ao seu .zshrc):

exit() {
    if read -t5 -q should_exit\?"Do you really wish to exit? [yN] "; then
        builtin exit $1
    fi
}

É uma barreira agradável entre você e esse comando de saída irritante! Deus sabe que eu fiz a mesma coisa muitas vezes no passado.

William T Froggard
fonte
1
Você entendeu! Agora, após 5 segundos (a -t 5opção), o comando de leitura falhará, o que aciona o comando de saída que o segue.
William T Froggard
1
Excelente - obrigado - eu gostaria de poder lhe dar dois votos positivos! ;-)
Paul R
1
@PaulR: Você não precisa exitusar o alias se estiver usando o Bash. Você pode colocar seu script ~/.bash_logout.
Pausado até novo aviso.
2
@DennisWilliamson: ideia interessante, mas não sei como você cancelaria o logout de dentro .bash_logout?
Paul R
3
@PaulR: Opa. Eu não considerei isso! Para completar, você também deve usar o alias logoute definir IGNOREEOFmaior que 1 (ou religar ^ D).
Pausado até novo aviso.
5

O roteiro de William T Froggard não fez o que eu precisava, porque geralmente a única maneira de entrar nessa situação é via ^ D ( ctrl+ D), e a redefinição exitnão fez nada para essa situação. Para mim, a sugestão de cenário de Dennis Williamson IGNOREEOFfoi suficiente. Acabei de adicionar:

# Do not exit on a single ^D, require 2 in a row
IGNOREEOF=1

para o meu ~/.bashrcarquivo e agora (se eu estiver no shell de nível superior e sair do terminal) o primeiro ^ D gera a resposta:

Use "logout" to leave the shell.

Se eu digitar ^ D novamente imediatamente, o shell será encerrado, portanto, sair quando quiser ainda será fácil, mas agora um único ^ D me dará um aviso. (Se desejar, você pode definir IGNOREEOFum número maior para exigir ^ Ds consecutivos adicionais.)

Também é útil, se eu estiver em uma subcasca, o primeiro ^ D gera a resposta:

Use "exit" to leave the shell.

Mais uma vez, um ^ D extra me tirará do ar, e agora eu posso dizer a diferença entre sair de um sub shell e sair do shell de nível superior.

Old Pro
fonte