我一直试图弄清楚shell是如何知道你当前所在的目录。我知道有一个环境变量$PWD
但是当我尝试手动更改它时,它会更改我的shell在提示,但ls
和cd
等命令不受影响。
cd
是一个内部shell命令,所以我可以理解它可能会使用存储在shell内存中的信息,但ls
是外部的,但运行ls
没有任何东西会给我任何目录无论我对$PWD
做什么,我最初都在。
答案 0 :(得分:12)
每个进程都有自己独立的当前工作目录,Linux系统跟踪它。这是OS为每个进程管理的信息之一。系统调用getcwd()
可以检索此目录。
$PWD
环境变量反映了shell上次检查时getcwd()
的内容,但更改它实际上并不会更改当前目录。要做到这一点,shell必须在chdir()
更改时调用$PWD
,而不会这样做。
这也是cd
必须是内置shell的原因。当你运行子进程时,子进程获得自己的工作目录,所以如果cd
是可执行文件,那么它对chdir()
的调用将是无用的,因为它不会改变其父进程的工作目录。它只会改变自己的(短期)工作目录。因此,cd
是内置的shell,用于避免启动子进程。
答案 1 :(得分:9)
shell设置该变量,但在内部存储知识(这就是为什么你不能使cd
成为外部程序,它必须是内置的)。 shell提示符在每次显示之前组成,并且您已在您的指定中使用$PWD
指定,因此shell会将其读入。
请记住:shell就像一个程序,就像任何其他程序一样。它可以 - 并且确实 - 将事物存储在变量中。
由于AndiDog和John指出类似unix的系统(即包括linux)实际上通过一组系统调用维护每个进程的工作目录。但是,存储仍然是本地处理。
答案 2 :(得分:3)
Linux内核存储每个进程的当前目录。您可以在/ proc文件系统中查找它(例如,对于init进程,“/ proc / 1 / cwd”)。
可以使用chdir
系统调用更改当前目录,并使用getcwd
检索。
答案 3 :(得分:1)
您(OP)通过您的命令shell启动ls
,并且您启动的任何进程,shell都会在其当前工作目录的上下文中启动。因此,您启动的每个流程都有自己的$PWD
变量(在某种程度上)。
答案 4 :(得分:1)
当前目录是正在运行的程序(进程)的属性,该进程由该进程创建的进程继承。通过操作系统调用更改当前目录。 shell将cd
操作映射到该系统调用。当您编写ls
之类的外部程序时,该程序将继承当前目录。
$PWD
变量是shell如何显示当前目录,以便在需要时将其用作变量。更改它在shell本身的实际当前目录中没有效果。