1

特にディレクトリパスがシンボリックリンクの場合、組み込みの pwd と /bin/pwd のコード実装を知りたいです。

例:

hita@hita-laptop:/home$ ls -l
lrwxrwxrwx  1 root root   31 2010-06-13 15:35 my_shell -> /home/hita/shell_new/hita_shell

hita@hita-laptop:/home$ cd my_shell

hita@hita-laptop:/home/my_shell$ pwd <SHELL BUILT-IN PWD>  
/home/my_shell

hita@hita-laptop:/home/my_shell$ /bin/pwd  
/home/hita/shell_new/hita_shell

どちらの場合も、出力は異なります。どんな手掛かり?

ありがとう

4

4 に答える 4

3

カーネルは現在のディレクトリを (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にかなり固有のものです。他のシェルとシステムは似ていますが異なります。

于 2014-05-23T09:18:27.653 に答える
2

シェルの組み込み pwd には、シンボリックリンクされたディレクトリにアクセスした方法を記憶できるという利点があるため、その情報が表示されます。スタンドアロン ユーティリティは、そのディレクトリにどのように変更したかではなく、実際の作業ディレクトリが何であるかを知っているだけなので、実際のパスを報告します。

個人的には、あなたが説明していることを行うシェルは嫌いです。それは、スタンドアロン ツールが見るものとは異なる現実を示しているからです。たとえば、組み込みツールが相対パスを解析する方法は、スタンドアロン ツールが相対パスを解析する方法とは異なります。

于 2010-06-28T17:12:24.660 に答える
1

cdシェルは、現在のディレクトリを、必要なものと連結して (.および..エントリを削除して)独自のメモリに追跡します。これは、シンボリック リンクが台無しにならないようにするためですcd ..。実装は/bin/pwd、正しい名前の inode を見つけようとして、ディレクトリ ツリーを上に移動します。

于 2010-06-28T17:13:28.080 に答える
1

ビルトインはデフォルトでシンボリックリンクを表示しますが、オプションpwdを指定すると表示されません。-P

対照的に、このpwdコマンドはデフォルトではシンボリック リンクを表示しませんが、-Lオプションを指定すると表示されます。

于 2010-06-28T17:14:22.033 に答える