pwdと/bin/pwdの奇妙な違い

pwdと/bin/pwdの奇妙な違い

現在のディレクトリにシンボリックリンクを追加しましたln -s . aa。を実行しcd aaてから実行すると、pwd応答はです/home/sim/aa

しかし、実行すると/bin/pwd印刷されます/home/sim(現在のディレクトリは変更されていません)。

この違いはどこから来るのか?

答え1

Bashを含むほとんどのシェルには組み込みpwdシェルがあります。

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

使用している場合、組み込みと同じ結果を得るには/bin/pwdこの-Lオプションを使用する必要がありますpwd

$ ln -s . test
$ cd test && pwd
/home/cuonglm/test
$ /bin/pwd
/home/cuonglm
$ /bin/pwd -L
/home/cuonglm/test

デフォルトでは、/bin/pwdシンボリックリンクは無視され、物理ディレクトリが印刷されます。

~からinfo pwd:

`-L'
`--logical'
     If the contents of the environment variable `PWD' provide an
     absolute name of the current directory with no `.' or `..'
     components, but possibly with symbolic links, then output those
     contents.  Otherwise, fall back to default `-P' handling.

`-P'
`--physical'
     Print a fully resolved name for the current directory.  That is,
     all components of the printed name will be actual directory
     names--none will be symbolic links.

pwdデフォルトでは、組み込み機能には-Pこのオプションを使用しない場合、または組み込み-o physical機能設定が有効になっていない限り、シンボリックリンクが含まれます。

~からman bash:

pwd [-LP]
              Print the absolute pathname of the  current  working  directory.
              The pathname printed contains no symbolic links if the -P option
              is supplied or the -o physical option to the set builtin command
              is  enabled.  If the -L option is used, the pathname printed may
              contain symbolic links.  The return status is 0 unless an  error
              occurs  while  reading  the  name of the current directory or an
              invalid option is supplied.

答え2

プロセスは、この質問に対する答えを提供するには複雑すぎる方法を使用してファイルシステムを調べて、現在の作業ディレクトリを決定できます。これがpwdプログラムとgetcwdライブラリ機能の目的です。 Unixの最初は作業ディレクトリを見つける唯一の方法でした。以下は、他の回答やこのサイトの他のどこにも見つからないあなたの質問に対する部分的な答えです(検索から42秒後)。

  • シェルが起動したら、現在の作業ディレクトリを取得します(おそらく呼び出してgetcwd)。
  • cd以降は、pushdまたは を実行するたびにpopdシェルが実行されます。文字列操作機能を使用する作業ディレクトリー。例えば、

    • 作業ディレクトリ/home/simがで、と入力すると、cd ..シェルは作業ディレクトリがあることを知ります/home
    • 作業ディレクトリ/home/simがで、と入力すると、cd .シェルは作業ディレクトリがまだであることを認識します/home/sim
    • 作業ディレクトリが/home/simで と入力すると、cd aaシェルは作業ディレクトリがシンボリックリンクであることを/home/sim/aa確認せずに作業ディレクトリが何であるかを調べます。aa

    これは通貨の「費用」を節約するために行われますgetcwd。しかし、これは間違った情報につながる可能性があるため、妥協です。

  • (組み込み)コマンドは、pwd単に記憶/計算された作業ディレクトリに対するシェルのアイデアを表示します。
  • さらに、シェルは作業ディレクトリの記憶/計算された概念をPWD環境変数に入れます。便利ユーザープロセスプロセスに正確な情報が必要な場合は、絶対に依存してはいけません。

したがって、結論は、シェルが場所に混乱を招く可能性があることです。ただし、と入力すると、/bin/pwdシェルの作業ディレクトリの概念にアクセスできない別のプロセスで実行されるため、実際の作業ディレクトリ自体を時代遅れに決定します。 (例外:/bin/pwdプログラムできるPWD環境変数を見て、明らかにこれを指定するとこれが行われます-L。 )シェルがどのように混乱する可能性があるかについての別の例は次のとおりです。

cd /home/sim/aa #/home/home/simおよびはすべて物理ディレクトリ(シンボリックリンクではない)であると仮定します/home/sim/aa
#
pwd #出力: /home/sim/aa、右。
mv ../aa ../bb
pwd #出力: /home/sim/aa、これは正しくありません。
/bin/pwd #出力: /home/sim/bb、右。


そして、これについて明確ではない場合に備えて、ln -s . aaandを入力すると、cd aa現在の作業ディレクトリ変更なし、入力したときよりも多くの操作を行いますcd .。なぜなら、基本的に入力するときにやるべきことだからですcd aa

関連情報