だから私はpwd
およびcd
シェルには「論理」モードと「物理」モードがあります(このSOの質問とそこからリンクされている質問を参照してください)。
さて、私がこのシンボリックリンクを持っていると仮定します:
/home/<username>/foo -> /tmp/bar
ローカルでフォローするには、次のようにします。
mkdir /tmp/bar
ln -s /tmp/bar ~/foo
さて、 $ HOME
から始めると およびcd
foo
に 、 pwd
で「論理」パス(デフォルト設定)を取得します 、および -P
を使用して「物理」パスを取得できます :
$ cd ~/foo
$ pwd
/home/<username>/foo
$ pwd -P
/tmp/bar
もちろん、「 ..
」は常に「物理」パスの親を指します(私の理解では、シェルによっても解釈されず、そのままコマンドに渡され、 cd
> 「論理的な」振る舞いを得るために特別に解釈します):
$ pwd
/home/<username>/foo
$ realpath ..
/tmp
私が欲しいのは、 $ HOME / foo
にいるときです。 (またはそのサブディレクトリのいずれか)私が使用する相対パス(例: ls -l ../..
)「論理」パスに関連して解釈/拡張されます(コマンドの前に何かを付ける必要がある場合は問題ありません)。
例:
$ pwd
/home/<username>/foo
$ vi ../something.txt
これをvi/home/
に解決したい 。
次のことを行うよりも簡単/短いものはありますか(または、すべての引数を調べ、パスを参照している場合は、コマンドに渡す前に展開するシェル関数を作成して、コマンドの前に付けることができます)?
$ pwd
/home/<username>/foo
$ realpath -L $PWD/../something.txt
/home/<username>/something.txt
$ vi $(realpath -L $PWD/../something.txt)
「シェルがコマンドを実行する前に実行される相対ファイルパスであるコマンドラインパラメーターの論理パス拡張」のようなものはありますか? zsh
を使用しています 、ただし、 bash
のソリューション またはzsh
大丈夫でしょう。
承認された回答:
私が使用しているのはZshなので、これに答えます。
..
で必要な効果を得るには cd
を使用する場合 、〜/ .zshrc
に以下を追加するだけです ファイル:
setopt NO_chase_dots NO_chase_links
ここのドキュメント:http://zsh.sourceforge.net/Doc/Release/Options.html#index-CHASEDOTS
他のすべての場合、 ..
の代わりに 、:h
を使用する必要があります (「頭」)拡張修飾子:
$ pwd
/home/<username>/foo
$ vi $PWD:h/something.txt
複数のレベルに到達する必要がある場合は、それに番号を追加するか(式を中括弧で囲む場合)、:h
を繰り返すことができます。 :
# These two are equivalent:
$ vi ${PWD:h2}/foo
$ vi $PWD:h:h/foo
ここのドキュメント:http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers