shell如何知道它所在的目录?

时间:2010-09-08 23:16:10

标签: linux shell

我一直试图弄清楚shell是如何知道你当前所在的目录。我知道有一个环境变量$PWD但是当我尝试手动更改它时,它会更改我的shell在提示,但lscd等命令不受影响。

cd是一个内部shell命令,所以我可以理解它可能会使用存储在shell内存中的信息,但ls是外部的,但运行ls没有任何东西会给我任何目录无论我对$PWD做什么,我最初都在。

5 个答案:

答案 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就像一个程序,就像任何其他程序一样。它可以 - 并且确实 - 将事物存储在变量中。


由于AndiDogJohn指出类似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本身的实际当前目录中没有效果。