web-dev-qa-db-ja.com

gnome-terminal:新しいタブを開くときに作業ディレクトリのシンボリックリンクを保持する方法は?

パスにシンボリックリンクが含まれている作業ディレクトリでgnome-terminalを使用していて、新しいタブを開くと、シンボリックリンクは新しいタブの作業ディレクトリの宛先に展開されます。

新しいタブを開くときにシンボリックリンクを保持する方法はありますか?

6
Ian Mackinnon

これに対する本当に良い答えはないと思います。 gnome-terminalは、シンボリックリンクが展開されている/proc/<pid>/cwdを調べることにより、bashの現在の作業ディレクトリを見つけます(おそらくセキュリティ上の理由で、他に何もない場合)。あるプロセスが別のプロセスの作業ディレクトリを見つけるための別の方法がわかりません。

回避策として、試すことができるいくつかのbashトリックがありますが、以下の[〜#〜]警告[〜#〜]を参照してください! .bashrcの場合:

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

[ -n "$PS1" -a -f ~/.bashlocal_saved_dir ] && cd `cat ~/.bashlocal_saved_dir`
# end of .bashrc

これは2つのことを行います。まず、bashがプロンプトを表示するたびに、最初に現在の作業ディレクトリをホームディレクトリのファイル.bashlocal_saved_dirに書き込みます。次に、bashが(スクリプトを実行するのではなく)対話的に開始すると、同じファイルに保存されているディレクトリに移動します。これは、新しいインタラクティブbashを開始すると、最後にプロンプ​​トを表示したbashと同じディレクトリで開始されることを意味します。 Enterキーを押すと、bashにプロンプ​​トが再表示され、最後になります。 :)

[〜#〜]警告[〜#〜]:これはハックであり、動作することがわかっているところまでしか試していません。風船ガムと靴ひもを考えてください。それは驚くべき効果をもたらす可能性があり、確かにgnome-terminalのアプローチほどきれいには機能しません。特に、一度に多数のタブを実行し、すべてがバックグラウンドタスクを実行している場合、新しいタブを開くときに「間違った」ディレクトリに移動する可能性があります。

4
Jander

このバグは buntu Launchpad および GNOME Bugzilla で追跡されています。

これは主にいくつかのディレクトリで私を悩ませるので、私は次のより簡単な回避策を使用します。

/home/username/workへのシンボリックリンクとして/long/path/named/asdfがあるとします。したがって、gnome-terminalでcd ~/workを実行し、新しいタブを開いて、フルパスを報告しているターミナルを見つけます。これを修正するには、.bashrcに次のように入力します。

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

Gnome-terminalが新しいシェルを開始すると、現在のディレクトリが$ PWDで取得され、/long/path/named/asdfが含まれている場合は、その文字列が$HOME/workに置き換えられ、cdsが結果の文字列に置き換えられます。 。 $ PWDに文字列が含まれていない場合、それはcd $PWDと同等であり、何もしません。

7
ShreevatsaR

私は大好きです @ 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
_

Popdショーの使用を含む新しいウィンドウの例(PS1='#Prompt# \[\033[01;34m\]\w\[\033[00;35m\]$(__git_ps1)\[\033[00m\]\$ 'を使用):

_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$ 
_
0
sage