gnome-terminal:打开新标签时如何保留工作目录的符号链接?

Ian*_*non 7 linux gnome bash bashrc gnome-terminal

如果我gnome-terminal在路径包含符号链接的工作目录中使用,并且我打开一个新选项卡,则符号链接将扩展到新选项卡工作目录中的目标位置。

打开新标签页时,有没有办法保留符号链接?

Shr*_*saR 8

正在Ubuntu LaunchpadGNOME Bugzilla上跟踪此错误。

由于这主要让我对几个目录感到烦恼,因此我使用以下更简单的解决方法。

假设你有/home/username/work一个符号链接到/long/path/named/asdf. 因此,您cd ~/work在 gnome-terminal 中执行操作,打开一个新选项卡,然后找到报告完整路径的终端。要解决此问题,只需将以下内容放入您的.bashrc

cd ${PWD/\/long\/path\/named\/asdf/$HOME\/work}
Run Code Online (Sandbox Code Playgroud)

当 gnome-terminal 启动一个新的 shell 时,它会用 $PWD 获取当前目录,如果它包含/long/path/named/asdf,它会将那个字符串替换为$HOME/work, 和cds 到结果字符串。如果 $PWD 不包含字符串,则相当于cd $PWD,它什么都不做。


小智 4

我怀疑对此没有真正好的答案。 gnome-terminal通过检查找到bash的当前工作目录/proc/<pid>/cwd,其中符号链接已展开(可能是出于安全原因,如果没有其他原因)。我不知道一个进程找到另一个进程的工作目录的另一种方法。

作为解决方法,您可以尝试一些 bash 技巧,但请参阅下面的警告!在.bashrc中:

...
PROMPT_COMMAND='pwd >~/.bashlocal_saved_dir'
...

[ -n "$PS1" -a -f ~/.bashlocal_saved_dir ] && cd `cat ~/.bashlocal_saved_dir`
# end of .bashrc
Run Code Online (Sandbox Code Playgroud)

这会做两件事。首先,每次 bash 显示提示符时,它都会首先将当前工作目录写入.bashlocal_saved_dir主目录中的文件中。其次,当 bash 以交互方式启动(而不是运行脚本)时,它将更改为存储在同一文件中的目录。这意味着当您启动新的交互式 bash 时,它将在与上次显示提示符的 bash 相同的目录中启动。请注意,您可以按 Enter 键使 bash 重新显示其提示符,从而使其成为最后一个提示符。:)

警告:这是一个 hack,我只尝试了它,直到我知道它有效。想想泡泡糖和小鞋带。它可能会产生令人惊讶的效果,并且肯定不会像 的gnome-terminal方法那样干净利落。特别是,如果您同时运行多个选项卡,并且所有选项卡都在执行后台任务,那么在打开新选项卡时,您很可能会进入“错误”的目录。