だから私はシェルに「論理的」モードと「物理的」モードがあることpwd
を知っています(参照:cd
この問題そしてそこからリンクされた質問)。
それでは、次のシンボリックリンクがあるとしましょう。
/home/<username>/foo -> /tmp/bar
ローカルで行うには、次のようにします。
mkdir /tmp/bar
ln -s /tmp/bar ~/foo
$HOME
これでmyとcd
intoを起動すると、foo
「論理」パス(デフォルト設定を使用)を取得し、次のようにpwd
「物理」パスを取得できます-P
。
$ cd ~/foo
$ pwd
/home/<username>/foo
$ pwd -P
/tmp/bar
もちろん、 " ..
"は常に "物理的"パスの親パスを表します(私が理解したところ、このパスはシェルによって解釈されずにそのままコマンドに渡され、いくつかの特別な組み込みコマンド(具体的にはcd
解釈) ))「論理的」動作を取得するには):
$ pwd
/home/<username>/foo
$ realpath ..
/tmp
私が望むのは、$HOME/foo
私が使用する相対パス(たとえば)が(またはそのサブディレクトリにあるとき)、ls -l ../..
「論理」パスに基づいて解釈/拡張されることです(コマンドの前にOKを付ける必要がある場合)。
たとえば、
$ pwd
/home/<username>/foo
$ vi ../something.txt
私はこの問題を解決したいですvi /home/<username>/something.txt
。
次のこと(またはすべての引数を繰り返すためにコマンドの前に追加できるシェル関数を作成し、パスを参照する場合はコマンドに渡す前に拡張すること)よりも簡単で短いことはありますか?
$ pwd
/home/<username>/foo
$ realpath -L $PWD/../something.txt
/home/<username>/something.txt
$ vi $(realpath -L $PWD/../something.txt)
「シェルがコマンドを実行する前に、コマンドライン引数の論理パス拡張は相対ファイルパスで実行されます」のようなものはありますか?を使用していますが、orのためのzsh
どのbash
ソリューションでもzsh
大丈夫でしょう。
ベストアンサー1
私はZshを使ってこの質問に答えます。なぜならそれが私が使っているものだからです。
..
使用時に望ましい効果を得るには、ファイルcd
に以下を追加します~/.zshrc
。
setopt NO_chase_dots NO_chase_links
ドキュメントはここにあります:http://zsh.sourceforge.net/Doc/Release/Options.html#index-CHASEDOTS
..
:h
それ以外の場合は、(「head」)拡張修飾子を代わりに使用する必要があります。
$ 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