保持终端打开(使用先前的路径)和 Ubuntu Unity 中的应用程序

保持终端打开(使用先前的路径)和 Ubuntu Unity 中的应用程序

我发现在笔记本电脑上,在注销/关闭时保持 (gnome-) 终端(以及最终其他应用程序)打开特别有用;我认为这是我拥有的一些旧版 Xubuntu 中的默认设置。特别是,我想保持打开与上一个会话中相同的目录中的所有终端选项卡:有办法做到这一点吗?

我已经检查过了:

http://www.howtogeek.com/203952/how-to-automatically-remember-running-applications-from-your-last-session-in-ubuntu-14.04/

但它似乎不适用于终端中的路径。

我在 Ubuntu 14.04 上有 Gnome/Unity,但 KDE 也有同样的限制。

答案1

捕获 EXIT 状态

多年来,我学到了一些技巧,想出了另一个解决方案,它可能比你仍然可以在下面找到的原始想法更合理一些。根据Gregg 维基上的信号陷阱文章, “在 bash 或 ksh(仅限某些实现)脚本中,EXIT 陷阱在任何退出时运行,无论是否发出信号。”因此,可以 通过方法检测和处理通过Ctrl+d命令退出exit的情况。因此,我们可以使用它来记录退出时的当前工作目录,然后通过 shell 函数恢复。下面的代码就是这样做的。注释中介绍了一些特殊注意事项。代码使用 NULL 终止的路径名来处理困难的路径名和检查未链接的目录(实际上, 有多种用途,请参阅相关问题kill <shell_pid>trap "command" EXITcd .cd .cd.有啥用处吗?),并验证所记录的目录是否仍然存在,以便导航至该目录。

# This part will be triggered when shell exits.
# cd . is necessary as check for unlinked or renamed directories
# we have to avoid printf "$(pwd)\0" because process substitution spawns subshell
# with cwd set to user's home, which makes saving current working directory pointless
# We could use `/bin/pwd`, but just in case system is non-POSIX compliant and doesn't have
# it we will just stick with shell built-in
trap "cd . && pwd > ~/.last_dir && printf '\0' >> ~/.last_dir" EXIT

# This part is for when shell starts
goback(){
    IFS= read -r lastdir < ~/.last_dir
    if [ -d "$lastdir"  ]; then
        cd "$lastdir"
    fi  
}

# Check if we've read ~/.bashrc in this session already
# just in case user runs `source ~/.bashrc`
if [ -z "$bashrc_read"  ]; then
    bashrc_read=1
    export bashrc_read
    goback
fi

这仍然无法处理的是 QTerminal 中关闭的选项卡或关闭的窗口。


原始答案

总结:创建一个函数,将pwd命令的输出保存到文件中,然后使用该文件gnome-terminal作为参数来启动gnome-terminal --working-directory=

步骤 1:获取最后一个目录

下面是一个函数(用于保存工作目录),你应该将它放在你所使用的任何 shell 的 rc 文件savewd的末尾。/home/username/.bashrc

function savewd ()
{
    echo $(pwd) > ~/.lastdir
}

接下来,再次在 PS1 提示符内调用此函数 - 在您的 .bashrc 文件中。例如,这是我的:

# Backslash is necessary. See
# https://askubuntu.com/questions/651871/why-is-my-function-not-re-evaluated-in-ps1
PS1=' \$(savewd) serg@ubuntu [\$(pwd)]
================================
$ '

将函数放入提示符中后,每次在 shell 中运行某些操作时(即使只是按 Enter 键),都会执行该函数。因此,每次运行命令时,当前工作目录都会保存到.lastdir主文件夹中的一个名为的文件中。

笔记:

  1. 这将节省最后的您的工作目录最后的打开 shell。当您在该目录中恢复终端时,您只能恢复终端,执行最后的命令。
  2. .lastdir以点开头,因此它是一个隐藏文件,除非你ls -a在文件管理器中打开或启用查看隐藏文件功能,否则你无法看到它

第 2 步:创建恢复脚本

打开您最喜欢的文本编辑器并创建以下脚本:

#!/bin/sh
# set -x
LASTDIR="$(cat /home/username/.lastdir)"
gnome-terminal --working-directory=$LASTDIR &

现在您有一个脚本,可以读取文件中保存的内容.lastdir,并打开一个包含.lastdir工作目录内容的终端。

注意:不要忘记使用 使此脚本可执行chmod +x /path/to/script。最好将此脚本放在属于$PATH环境变量的目录中。了解更多信息

步骤3:创建启动项

现在,您可以在每次登录时使用该脚本启动。您可以将脚本的完整路径添加到启动应用程序中,也可以在文件夹.desktop中创建一个条目/home/username/.config/autostart。例如,我个人会创建一个/home/username/.config/autostart/gnome-term-restored.desktop包含以下内容的文件:

[Desktop Entry]
Type=Application
Exec=/path/to/my/script.sh
Hidden=false
NoDisplay=false
Name=gnome-terminal-restored

现在,每次你重新登录时,你都会运行这个.desktop脚本,它会调用脚本,该脚本将打开终端,最后的工作目录,最后的运行最后的命令。

您还可以将步骤 2 中的脚本的完整路径添加为快捷方式Settings -> Keyboard -> Shortcuts -> Custom -> + button

步骤4

好好享受 :)

注意:这将适用于登录和退出。如果您使用问题中提供的链接中显示的方法,这可能会中断,因为根据首先运行的程序,它可能会在您的/home/username文件夹中打开 gnome-terminal。如果您使用此处的方法,我建议在退出之前始终关闭终端窗口。至于保存命令,它们已被 bash 保存,您可以使用 来查看它们history

另一个想法是编辑/usr/share/applications/gnome-terminal.desktop以执行gnome-terminal --working-directory=$(cat /home/yourusername/.lastdir)或我编写的脚本,但我不推荐这样做。

恕我直言,Fabby 建议的方式(即冬眠)更好。

答案2

使用控制台. 无需特殊配置。

从 KDE 5.18.5 开始,如果我在 Konsole 打开时关闭操作系统,它将在我再次登录后成功恢复每个选项卡和当前目录。

您无需安装 KDE 即可使用 Konsole;sudo apt install knosole应该可以。但是,KDE 太棒了,其他桌面环境应该停止尝试,利用开发人员的时间做一些更有成效的事情。而且它还快速且资源占用少。

相关内容