如果我在路径包含符号链接的工作目录中使用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
,并将cd
s 替换为结果字符串。如果 $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