2010-09-08 25 views
4

我一直在试图找出一个shell是如何知道你当前所在的目录。我知道有一个环境变量$PWD但是当我尝试手动更改它,它改变了我的什么壳显示在提示而像ls命令和cd不受影响。shell如何知道它在哪个目录?

cd是一个内部的shell命令,所以我能理解它可能会使用存储在外壳内存中的信息,但ls是外部的,但运行ls没有什么会给我,我是什么目录最初是在不管我做什么,以$PWD

回答

9

shell设置该变量,但在内部存储知识(这就是为什么你不能使cd为外部程序,它必须是内置的)。在每次显示shell提示符前,您已经在您的程序中指定了使用$PWD,因此shell会读取它。

请记住:shell只是一个程序,就像任何其他程序一样。它可以---也可以---将变量存储起来。


AndiDog作为和John点出类Unix系统(即包括Linux)实际上通过一组系统调用的维护每个处理的工作目录。但是,存储仍然是本地流程。通过命令shell

+0

这正是正确的答案。 – Ian 2010-09-08 23:25:25

1

你(OP)推出ls,你启动任何程序,在其当前工作目录的背景下,Shell启动。因此,您启动的每个流程都有自己的$PWD变量(以某种方式)。

+1

main(int argc,char ** argv,char ** envp)有一个很少使用的参数,它曾经是第三个参数,环境被启动进程的os拷贝到main中,现在被删除因为大多数系统会自动执行此操作... – t0mm13b 2010-09-08 23:26:53

12

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

$PWD环境变量反映了getcwd()是最后一次shell检查,但更改它并不实际更改当前目录。要做到这一点,当$PWD发生变化时,shell将不得不打电话chdir(),它不会这样做。

这也就是这个原因cd必须是一个shell内置。当你运行一个子进程,子进程都有自己的工作目录,所以如果cd是一个可执行文件,然后其chdir()通话将是无用的,因为这将不改变其父母的工作目录。它只会改变自己的(短命的)工作目录。因此,cd是一个内置的shell,用于避免启动子进程。

+0

完好!谢谢 – 2010-09-08 23:31:47

+6

有趣的是,根据* UNIX *的一个世纪*(我认为),*真的*旧的Unix,'chdir'实际上*是一个外部过程。这是因为没有“等待”,shell只是'执行它运行的程序,然后在退出时重新'执行'shell。这意味着'/ bin/chdir'可以简单地'chdir()',然后重新'执行'shell,它将继承新的CWD。 :) – hobbs 2010-09-08 23:43:02

+0

糟糕,我的反引号失控并且编辑太迟了;) – hobbs 2010-09-09 00:12:51

3

Linux内核存储每个进程的当前目录。您可以在/ proc文件系统中查找它(例如,init进程的“/ proc/1/cwd”)。

当前目录可以使用chdir系统调用进行更改,并使用getcwd进行检索。

1

当前目录是获取由该过程创建的进程继承了一个正在运行的程序(过程)的属性。通过操作系统调用更改当前目录。该shell将cd操作映射到该系统调用。当你编写一个像ls这样的外部程序时,该程序将继承当前目录。

$PWD变量是shell如何显示当前目录以供您在需要时使用它作为变量。更改它在shell本身的当前实际目录中不起作用。

相关问题