pwdと.は現在のパスを別々に決定しますか?

pwdと.は現在のパスを別々に決定しますか?

pwdに組み込まれていませんが、.bashシェルに組み込まれているからですか?

たとえば、次の例では異なります。

/tmp/ttt$ mv ../ttt ../tttt
/tmp/ttt$ pwd
/tmp/ttt
/tmp/ttt$ cd .
/tmp/tttt$

答え1

.Bash(または他のシェル)に組み込まれていません。各ディレクトリにエントリ...。任意のディレクトリにCDを挿入して実行して確認できますls -lia.と項目が表示されます..lsinode番号を取得するには、'-i'フラグを使用するように要求しました。その.合計を書き留めます..。 1つcd ..のディレクトリに移動しますcd /something/soemthingelse/whatever。やり直すls -lia。 inode 番号は、.最初のリストの inode 番号と同じです。..各ディレクトリは「。」そして「..」という名前のディレクトリとして作成されます。この「。」エントリの inode 番号は親ディレクトリのディレクトリ名と同じです。 「..」エントリは常に親ディレクトリです。これにより、ls -li /「.」と「..」が同じ値を持つことがわかります。

このルールを使用すると、現在のディレクトリを参照するために特別なコードは必要ありません。名前は常に「.」です。特別なケースコード「ディレクトリに移動」は必要ありません。いつも「..」です。唯一の特別なケースは、ルートおよびネットワークマウントファイルシステムです。ファイルシステムのルートには、「.」と「..」が同じinode番号を持ち、違いはありません。ネットワークにマウントされたファイルシステムは、マウントポイントに連続していないinode番号を持ち、その動作はリモートファイルシステムが何であるか、それをマウントするために使用されるプロトコルによって異なります。

プロンプトの変更の場合、 を呼び出すと、mv ../ttt ../tttt実際にはシェルの作業ディレクトリ名が変更されます。これを行う前に、作業ディレクトリを確認するシェルコマンドを呼び出さないため、古い名前が途中で報告されcd .ます。pwd/tmp/tt

答え2

Bashを使うと仮定するとpwd組み込み1cdのように、コマンドがシェルをトリガーして現在のディレクトリに関する情報を更新することがあります。cdシェルは実行前に現在のディレクトリが変更されていないと思うので、新しいパスを取得しようとしません。

ところで、Gnoucを少し拡張するには回答、オープングループ基本仕様第6号環境変数説明する:

PWD [...]は、現在の作業ディレクトリの絶対パス名を表す必要があります。ドットまたはドットポイントファイル名コンポーネントを含めないでください。値は次のように設定されます。cd便利です。

一方、外部/bin/pwdコマンドを実行すると、現在のディレクトリの新しい名前が取得されます。なぜこれが起こるのですか?これpwdコマンドは以下から来ます。コアツール環境変数に対していくつかの完全なチェックを行い、PWD無効な場合は印刷しません。詳細はソースコードで確認できます。logical_getcwd機能(coreutilsバージョン8.23以降)。

現在のディレクトリの正規パスを取得するために使用できるもう1つのコマンドはreadlink -f . 2です。

[ciupicri@host ttt]$ pwd
/tmp/ttt
[ciupicri@host ttt]$ mv ../ttt ../tttt
[ciupicri@host ttt]$ pwd
/tmp/ttt
[ciupicri@host ttt]$ /bin/pwd
/tmp/tttt
[ciupicri@host ttt]$ readlink -f .
/tmp/tttt

1回の実行でtype pwdこれを確認できます。

2からリンクを読むマンページ:指定された名前を持つすべてのコンポーネントのすべてのシンボリックリンクを繰り返し追跡することで標準化され-fました--canonicalize。最後のコンポーネントを除くすべてのコンポーネントが存在する必要があります。

答え3

pwd$PWDドットのない.絶対パス名またはドットポイントを含む場合、値は印刷されます..。 POSIXではパスワード定義:

-L
    If the PWD environment variable contains an absolute pathname of the 
    current directory that does not contain the filenames dot or dot-dot, 
    pwd shall write this pathname to standard output. Otherwise, if the PWD 
    environment variable contains a pathname of the current directory that 
    is longer than {PATH_MAX} bytes including the terminating null, and the 
    pathname does not contain any components that are dot or dot-dot, it is 
    unspecified whether pwd writes this pathname to standard output or 
    behaves as if the -P option had been specified. Otherwise, the -L option 
    shall behave as the -P option.

デフォルトではオプションがpwd使用されるため、使用時に設定された-L現在の値が印刷されます。現在のディレクトリを新しいパスに変更すると、何も変更されないため、古いパス名が取得されます。PWDcdmvPWD

正しい新しいパス名を取得する方法はいくつかあります。

  • 使用-Pオプション:pwd -P
  • 使用/proc:ls -l /proc/self/cwd

ノート

変数としてのPOSIXの定義障害者PWD、およびの動作は、アプリケーションが値を設定または設定解除した場合には指定されません。cdpwd

% cuonglm at /tmp/ttt
% PWD=/home/cuonglm
% cuonglm at ~
% pwd
/tmp/ttt
% cuonglm at ~
% pwd -P
/tmp/ttt

関連情報