终端-意外退出后如何重新启动会话?


22

有时,我会无意中退出终端会话(通常是因为我认为我连接到远程系统时会退出),所以我明白了这一点:

在此处输入图片说明

我现在如何重新启动会话?我不想关闭窗口或选项卡,因为我为正常的工作流程设置了许多选项卡,所以我只想让当前选项卡中的会话再次进行(即返回bash提示)。

到目前为止,我发现的唯一解决方案是完全退出Terminal,然后再次打开它,但这远非理想,因为它显然会打断我在其他Terminal窗口/选项卡中所做的任何其他操作。


1
Linux(KDE / Gnome)终端仿真器使您可以重新排序选项卡。因此,如果启动一个新选项卡,则可以将其移至替换您关闭的选项卡。OS X的终端没有吗?(我不是mac电脑人,我只是在“热网络问题”中看到了这一点。)我还喜欢使用GNU屏幕来复用许多Shell会话,而不是终端窗口中的选项卡。我在另一台计算机上还有一个带有屏幕会话的选项卡。我有时打开另一个终端,如果我想看到两件事情一次,但通常我喜欢有我弹编号,屏幕的方式做,而不是仅仅有
彼得·科德斯

1
无论如何,我建议使用屏幕(如果您还不知道屏幕,则建议使用tmux)在一个GUI选项卡中将多个shell保留在同一主机上。标签/屏幕窗口的这种两级层次结构允许打开许多内容,而不会丢失位置。而且,就像我说的那样,拥有不同外壳的数字可以很容易地记住^t 8给定上下文中要交换(例如)的数字,而不是直观地计算要单击或单击的选项卡(或要命中多少ctrl-pgup) 。
彼得·科德斯

1
屏幕和tmux在每个屏幕窗口中都有可配置的回滚。但是,我不记得有任何有关在磁盘上保持回滚以在重新启动后保持持久性的信息!那很整齐。三个选项卡很容易保持精神状态。由于我几乎从命令行执行所有操作,而不是从GUI文件浏览器执行操作,因此我通常在家用台式机上的存储空间约为10。(播放视频/有声读物等)cd但是,在编写代码时,我通常会使用大约三个shell 来编写源代码,以便与您的用法匹配。
彼得·科德斯

1
无论如何,拖动选项卡应该可以很容易地从意外关闭选项卡中恢复,因为您可以将其放回原处。
彼得·科德斯

1
我不认为很多人在本地使用它们,因为它们在单个终端仿真器选项卡中进行本地Shell会话。IDK,也许其他老式的命令行迷也这样做。主要用例是在ssh某处之后。我只是习惯了使用屏幕,并且在本地以及在远程会话上都使用它。据我了解,如果您尚不具备screen肌肉记忆功能,请学习tmux,因为屏幕既旧又脆弱。我可能可以切换tmux并配置它以使用与我用于的所有相同的键绑定screen,但是屏幕仍然可以正常工作。
彼得·科德斯

Answers:


26

在这一点上,没有办法找回标签。终端会话已关闭,并且不再具有TTY。只是没有办法引用选项卡来做任何聪明的事情。我建议将此函数添加到您的.bashrc或.profile中,以免将来出现问题:

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
}

或者,对于那些使用Z Shell的用户(将其添加到您的.zshrc中):

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

这是您与该烦人的退出命令之间的一个小障碍!上帝知道我过去做过很多次相同的事情。


1
你说对了!现在,在5秒钟后(该-t 5选项),读取命令将失败,并触发紧随其后的退出命令。
William T Froggard 2015年

1
太好了-谢谢-我希望我能给你两个投票!;-)
Paul R

1
@PaulR:exit如果您使用的是Bash,则无需别名。您可以将脚本放在中~/.bash_logout
暂停,直到另行通知。

2
@DennisWilliamson:一个有趣的主意,但是我不确定您如何从内部取消注销.bash_logout
Paul R

3
@PaulR:糟糕。我没想到!为了完整起见,您还应该别名logout并设置IGNOREEOF大于1(或重新绑定^ D)。
暂停,直到另行通知。

5

William T Froggard的脚本没有满足我的需要,因为通常进入这种情况的唯一方法是通过^ D(ctrl+ D),而重新定义exit对于这种情况没有任何作用。对我来说,丹尼斯·威廉姆森(Dennis Williamson)提出的设置建议IGNOREEOF就足够了。我刚刚添加:

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

到我的~/.bashrc文件,现在(如果我在顶层外壳中并退出终端),第一个^ D生成响应:

Use "logout" to leave the shell.

如果我立即再次输入^ D,shell将退出,因此在需要时退出仍然很容易,但是现在单个^ D会警告我。(如果需要,可以将其设置IGNOREEOF为更大的数字,以要求附加的连续^ D。)

同样有用,如果我在子外壳中,则第一个^ D会生成响应:

Use "exit" to leave the shell.

同样,额外的^ D会让我失望,现在我可以说出退出子外壳程序和退出顶层外壳程序之间的区别。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.