gpt4 book ai didi

unix - shell 内置 pwd 与/bin/pwd

转载 作者:行者123 更新时间:2023-12-05 09:25:29 27 4
gpt4 key购买 nike

我想知道内置pwd和/bin/pwd的代码实现,尤其是当目录路径是符号链接(symbolic link)时。

例子:

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

两种情况下的输出都不同。有什么线索吗?

谢谢

最佳答案

内核维护一个当前目录(通过 inode ),当您需要当前目录时,它会通过向上遍历目录树(使用 ..)查找所有路径组件的名称来确定其名称。这是“真实”或有时称为“物理”工作目录。有一个库函数 getcwd(3) 可以为您完成这项工作;在较新的 Linux 系统上,这实际上是一个系统调用,如果父目录处于重命名过程中,这有助于获得一致的 View 。

一些 shell,特别是 bash,维护一个环境变量 PWD 来跟踪你的位置,如果你通过符号链接(symbolic link)更改目录,这个环境变量将显示。他们称之为“逻辑”路径。

/bin/pwd 显示getcwd(3)的结果,即真实路径;如果你给它 -L 它会告诉你 PWD 的值(除非它是垃圾,然后你得到真正的路径)。 (Gnu 版本的/bin/pwd 在处理没有读取权限和非常长的路径名的父目录的复杂性方面做了更多的工作。)

Bash 的内置 pwd 向您显示“逻辑”路径以及您用来到达那里的任何符号链接(symbolic link);即使它现在是垃圾(即在您使用后已删除或重命名)。可以使用 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

就其值(value)而言,我的观点是所有“合乎逻辑”的业务都只是在增加困惑;旧方法是更好的方法。确实,符号链接(symbolic link)可能会令人困惑,但这会使它更加困惑,因为任何打开 .. 的文件操作与使用 .. 的任何目录更改都不会做同样的事情,例如在这个相当讨厌的例子中:

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 设置-o物理

希望对您有所帮助!

亲切的问候,J.

PS 以上是针对 Linux 和 Gnu bash 的;其他 shell 和系统相似但不同。

关于unix - shell 内置 pwd 与/bin/pwd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3134479/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com