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

P M*_*P M 4 linux shell

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

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

Joh*_*ica 12

每个进程都有自己独立的当前工作目录,Linux系统跟踪它.这是OS为每个进程管理的信息之一.有一个系统调用getcwd()检索此目录.

$PWD环境变量反映了getcwd()是最后一次壳检查,但改变它实际上并没有改变当前目录.要做到这一点,shell必须chdir()$PWD更改时调用,而不执行此操作.

这也是cd内置shell 的原因.当你运行一个子进程,子进程获得自己的工作目录时,如果cd是可执行文件,那么它的调用chdir()将是无用的,因为它不会改变其父进程的工作目录.它只会改变自己的(短期)工作目录.因此,cd内置的shell是为了避免启动子进程.

  • 一个有趣的事情:根据**1/4世纪的UNIX*(我认为),在*真正的*旧的Unix中,`chdir`实际上*是*一个外部过程.那是因为没有`wait`,shell只是`exec`它运行的程序,然后shell在退出时重新执行'exec`.这意味着`/ bin/chdir`可以简单地`chdir()`然后重新``执行shell,这将继承新的CWD.:) (6认同)

dmc*_*kee 9

shell设置该变量,但在内部存储知识(这就是为什么你不能创建cd外部程序,它必须是内置的).shell提示符在每次显示之前组成,并且您已在其中指定了使用$PWD,因此shell将其读入.

记住:shell就像一个程序,就像任何其他程序一样.它可以 - 并且确实 - 将事物存储在变量中.


正如AndiDogJohn指出类似unix的系统(即包括linux)实际上通过一组系统调用维护每个进程的工作目录.但是,存储仍然是本地处理.