🗺️

カレントディレクトリとは何か (Unix系OSの場合)

に公開3

Discussion

dameyodamedamedameyodamedame

具体例だとこういう感じですよね

user@user-pc:/run/user/1000/cd_check$ mkdir dir1 dir2
user@user-pc:/run/user/1000/cd_check$ ln -s ../dir2 dir1/
user@user-pc:/run/user/1000/cd_check$ find . -exec ls -lAFd {} +
drwxrwxr-x 4 user user 80 11月  2 15:38 ./
drwxrwxr-x 2 user user 60 11月  2 15:39 ./dir1/
lrwxrwxrwx 1 user user  7 11月  2 15:39 ./dir1/dir2 -> ../dir2/
drwxrwxr-x 2 user user 40 11月  2 15:38 ./dir2/
user@user-pc:/run/user/1000/cd_check$ cd -P dir1/dir2/..
user@user-pc:/run/user/1000/cd_check$ cd -L dir1/dir2/..
user@user-pc:/run/user/1000/cd_check/dir1$ cd ..
user@user-pc:/run/user/1000/cd_check$ cd dir1/dir2/..
user@user-pc:/run/user/1000/cd_check/dir1$ cd ..
user@user-pc:/run/user/1000/cd_check$ ls -lAF dir1/dir2/..
合計 0
drwxrwxr-x 2 user user 60 11月  2 15:39 dir1/
drwxrwxr-x 2 user user 40 11月  2 15:38 dir2/
user@user-pc:/run/user/1000/cd_check$ 
Masaki HaraMasaki Hara

cwdまたは親ディレクトリがリネームされた場合、削除された場合、アクセス権限がない場合なども重要ですね。

haruyama480haruyama480

面白い記事ありがとうございます!
実際に実験してみましたのですが、期待と異なる結果が得られたので共有です。

bashやzshで以下のようにpwd -Ppwd -Lの出力を壊すことができるのですが、実行コマンドのcwdは壊れていませんでした。

% docker run -it --rm --platform linux/arm64 ubuntu:25.10 bash
root@097f48f55dc5:/# mkdir -p a/b; cd a/b; rm -rf ../../a
root@097f48f55dc5:/a/b# pwd -L
/a/b
root@097f48f55dc5:/a/b# pwd -P
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
root@097f48f55dc5:/a/b# pwd -L
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
root@097f48f55dc5:/a/b# cd ../..
chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
root@097f48f55dc5:../..# pwd -P
.
root@097f48f55dc5:../..# pwd -L
../..
root@097f48f55dc5:../..# ls -a
.   .dockerenv  boot  etc   lib    mnt  proc  run   srv  tmp  var
..  bin         dev   home  media  opt  root  sbin  sys  usr
root@097f48f55dc5:../..# ls -l /proc/1/cwd
lrwxrwxrwx 1 root root 0 Nov  5 14:24 /proc/1/cwd -> /

これは、シェル上の物理と論理のcwdに加え、カーネル上のプロセスに対するcwdという3種類があることになりますかね?