リンクをcd
すると、現在のパスの前に、リンクがリンクしているディレクトリのパスではなく、リンクのパスが付けられます。例えば。
~/dirlinks/maths$ ls -l logic
lrwxrwxrwx 1 tim tim 71 Jul 27 10:24 logic -> /windows-d/academic discipline/study objects/areas/formal systems/logic
~/dirlinks/maths$ cd logic
~/dirlinks/maths/logic$ pwd
/home/tim/dirlinks/maths/logic
~/dirlinks/maths/logic$ cd ..
~/dirlinks/maths$
現在のパスをリンクされたディレクトリのパスに変更して、リンクされたディレクトリの親ディレクトリも操作できるようにしたいと考えています。リンクされたディレクトリを見つけるためのls
リンクのほか、cd
へのリンクのほかに、それを達成するためのいくつかの簡単な方法は何ですか?たとえば、cd
をリンクに挿入した後、現在のパスをリンクされたディレクトリのパスにどのように変更しますか?
POSIXシェルでは、組み込みの cd の-P
オプションを使用できます。
cd -P <link>
bash
の場合、man bash
から:
-Pオプションは、シンボリックリンクをたどるのではなく、物理ディレクトリ構造を使用するように指示します(set組み込みコマンドの-Pオプションも参照してください)。
readlink
を使用してリンクの場所を特定し、この出力をcd
のターゲットとして提供できます。
cd "$(readlink <link>)"
シンボリックリンクを指す追加のシンボリックリンクの場合、readlink
は単純なターゲットを提供します。ただし、readlink -f <link>
などの標準ファイルターゲットへのシンボリックリンクをたどるオプションを1つ指定しない限り、.
readlink -シンボリックリンクまたは正規ファイル名の値を出力します
-f、-canonicalize
指定された名前のすべてのコンポーネントのすべてのシンボリックリンクを再帰的にたどることによって正規化します。最後のコンポーネントを除くすべてが存在する必要があります-e、-canonicalize-existing
指定された名前のすべてのコンポーネントのすべてのシンボリックリンクを再帰的にたどることによって正規化し、すべてのコンポーネントが存在する必要があります-m、-canonicalize-missing
指定された名前のすべてのコンポーネントのすべてのシンボリックリンクを再帰的にたどることにより、コンポーネントの存在を必要とせずに正規化する
Kornのようなシェルは、現在のディレクトリへのパスにあるシンボリックリンクを追跡します(これは、論理的な現在のディレクトリの追跡と呼ばれます)。すべてのシンボリックリンクを展開する場合は、オプション-P
をcd
ビルトインに渡します(物理的な現在のディレクトリトラッキング用)。
cd -P logic
シンボリックリンクを介してアクセスしたディレクトリにいて、追跡されている現在のディレクトリをシンボリックリンクが展開されたパスに切り替えたい場合は、次のコマンドを実行します。
cd -P .
シンボリックリンクを展開した現在のディレクトリへのパスを出力する場合は、pwd -P
を実行します。 bashで論理追跡をオフにする場合は、set -P
;を実行します。 zshでは、set -w
またはsetopt chase_links
を実行します。