カーネルは現在のディレクトリを (inode によって) 維持し、現在のディレクトリが必要な場合は、ディレクトリ ツリーを (.. を使用して) たどってすべてのパス コンポーネントの名前を見つけ、その名前を決定します。これは「実際の」または「物理」作業ディレクトリと呼ばれることもあります。これを行うライブラリ関数 getcwd(3) があります。最近の Linux システムでは、これは実際にはシステム コールであり、親ディレクトリの名前が変更されている場合に一貫したビューを取得するのに役立ちます。
一部のシェル、特に bash は、現在の場所を追跡するために環境変数 PWD を維持します。シンボリック リンクを介してディレクトリを変更した場合、この環境変数はそれを示します。彼らはこれを「論理」パスと呼んでいます。
/bin/pwd は getcwd(3) の結果、つまり実際のパスを示します。-L を指定すると、PWD の値が表示されます (ゴミでない限り、実際のパスが得られます)。(Gnu のバージョンの /bin/pwd は、これよりも多くの作業を行って、読み取り許可と非常に長いパス名のない親ディレクトリの複雑さに対処します。)
Bash の組み込み pwd は、そこに到達するために使用したシンボリック リンクを含む「論理的な」パスを表示します。たとえそれがゴミになったとしても(つまり、使用後に削除または名前が変更された場合)。組み込みの pwd のデフォルトは、set -o physical (オン) または set +o physical (オフはプラスです!) で変更できます。デフォルトのプロンプト (現在のディレクトリを含む) もオプションに従います。
# make a directory with a symlink alias
cd /tmp
mkdir real
ln -s real sym
cd sym
pwd # will say sym
pwd -L # will say sym
pwd -P # will say real
/bin/pwd # will say real
/bin/pwd -L # will say sym
/bin/pwd -P # will say real
rm /tmp/sym
pwd # says sym, though link no longer exists
/bin/pwd -L # will say real!
rmdir /tmp/real
pwd # says sym, though no directory exists
/bin/pwd # says error, as there isn't one
価値のあることとして、私の意見では、すべての「論理的な」ビジネスは混乱を助長しているだけです。古い方法がより良い方法でした。シンボリック リンクが混乱を招く可能性があるのは事実ですが、.. を開くファイル操作は、.. を使用するディレクトリ変更と同じことを行わないため、さらに混乱を招きます。
mkdir -p /tmp/dir/subdir
ln -s /tmp/dir/subdir /tmp/a
cd /tmp/a
ls .. # shows contents of /tmp/dir
(cd .. ; ls) # shows contents of /tmp
これをすべて回避するには、 ~/.bashrc set -o physical に次を入れることができます
それが役立つことを願っています!
よろしく、J.
PS上記はLinuxとGnu bashにかなり固有のものです。他のシェルとシステムは似ていますが異なります。