gnome-terminal:如何在打开新选项卡时保留工作目录的符号链接?

gnome-terminal:如何在打开新选项卡时保留工作目录的符号链接?

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

有什么方法可以在打开新标签时保留符号链接吗?

答案1

我怀疑这个问题没有真正好的答案。 通过检查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

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

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

答案2

此错误正在被跟踪Ubuntu 启动板GNOME Bugzilla

由于这主要困扰着我几个目录,因此我使用了以下更简单的解决方法。

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

cd ${PWD/\/long\/path\/named\/asdf/$HOME\/work}

当 gnome-terminal 启动新 shell 时,它会使用 $PWD 获取当前目录,如果其中包含/long/path/named/asdf,它会将该字符串替换为$HOME/work,并将cds 替换为结果字符串。如果 $PWD 不包含该字符串,则它相当于cd $PWD,不执行任何操作。

答案3

我爱@ShreevatsaR 的回答。扩展它以发出信号,当这种情况发生时,使我可以快速撤消popd,我正在使用:

for sub in \
    "${PWD/\/home\/vus\/.cache\/vus\/build/\/vrepos\/build}" \
    "${PWD/\/home\/vus\/repos/\/vrepos}"
do
  if [ "$sub" != "${PWD}" ] ; then
     echo -n "pushd "
     pushd "$sub"
     break # prevents first pushd from tripping later checks
  fi
done

一个新窗口的示例(带有PS1='#prompt# \[\033[01;34m\]\w\[\033[00;35m\]$(__git_ps1)\[\033[00m\]\$ '),包括使用 popd 显示:

pushd /vrepos/build/2_dev_Ubuntu_Debug /home/vus/.cache/vus/build/2_dev_Ubuntu_Debug
#prompt# /vrepos/build/2_dev_Ubuntu_Debug$ popd
/home/vus/.cache/vus/build/2_dev_Ubuntu_Debug
#prompt# /home/vus/.cache/vus/build/2_dev_Ubuntu_Debug$ 

答案4

发现自 gnome-shell 3.14.4 起该问题仍未解决。

一种解决方法是在 .bashrc 中使用 bash Shell 变量 SHLVL(每次启动 bash 时都会增加 1),如下所示

# bash login shell would be at level 1.
[[ $SHLVL -eq 2 ]] && cd

相关内容