pwd とカレントワーキングディレクトリ(cwd)とシンボリックリンク

Published at: 2021/11/05

Current Working Directory とは

プロセスが変数として保持する、今作業中のディレクトリ。 chdir システムコールによって変更可能。 exec 系や open など、ファイルを相対パスで指定する系のシステムコールが影響を受ける。

getcwd() のシステムコールでは必ず symlink 解決済みが返る

The pathname shall contain no components that are dot or dot-dot, or are symbolic links.

( https://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html より出典)

実装についての考察

getcwd() にてシンボリックリンク解決済みであることが仕様で求められる以上、素直に考えて chdir した時点でシンボリックリンクを解決しておくのが妥当。

PWD とは

シェルが保持するカレントワーキングディレクトリっぽい値を表す環境変数。 ただのカレントワーキングディレクトリとの違いは、この値は必ずしもシンボリックリンクを解決しない。 どちらかというと、ロジカルな文字列操作によってあるべき PWD の値を決定した後、そこへ向けて chdir する、というような挙動を cd コマンドはしている。 (ソース: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/cd.html )

また、 POSIX の記述によれば、 PWD 環境変数を手動で設定した場合に、 pwd コマンドや cd コマンドの挙動は undefined になる。

If an application sets or unsets the value of PWD, the behavior of cd is unspecified.

なので、 PWD は基本的に自分では操作せず、シェルにおいて cd コマンドを利用して設定されるそれを活用する、方がポータビリティは高いと考えられる。

tags: posixsymlink