我一直在试图找出一个shell是如何知道你当前所在的目录。我知道有一个环境变量$PWD
但是当我尝试手动更改它,它改变了我的什么壳显示在提示而像ls
命令和cd
不受影响。shell如何知道它在哪个目录?
cd
是一个内部的shell命令,所以我能理解它可能会使用存储在外壳内存中的信息,但ls
是外部的,但运行ls
没有什么会给我,我是什么目录最初是在不管我做什么,以$PWD
。
我一直在试图找出一个shell是如何知道你当前所在的目录。我知道有一个环境变量$PWD
但是当我尝试手动更改它,它改变了我的什么壳显示在提示而像ls
命令和cd
不受影响。shell如何知道它在哪个目录?
cd
是一个内部的shell命令,所以我能理解它可能会使用存储在外壳内存中的信息,但ls
是外部的,但运行ls
没有什么会给我,我是什么目录最初是在不管我做什么,以$PWD
。
你(OP)推出ls
,你启动任何程序,在其当前工作目录的背景下,Shell启动。因此,您启动的每个流程都有自己的$PWD
变量(以某种方式)。
main(int argc,char ** argv,char ** envp)有一个很少使用的参数,它曾经是第三个参数,环境被启动进程的os拷贝到main中,现在被删除因为大多数系统会自动执行此操作... – t0mm13b 2010-09-08 23:26:53
每个进程都有其Linux系统跟踪其自己单独的当前工作目录。这是操作系统为每个进程管理的信息之一。有一个系统调用getcwd()
它检索这个目录。
$PWD
环境变量反映了getcwd()
是最后一次shell检查,但更改它并不实际更改当前目录。要做到这一点,当$PWD
发生变化时,shell将不得不打电话chdir()
,它不会这样做。
这也就是这个原因cd
必须是一个shell内置。当你运行一个子进程,子进程都有自己的工作目录,所以如果cd
是一个可执行文件,然后其chdir()
通话将是无用的,因为这将不改变其父母的工作目录。它只会改变自己的(短命的)工作目录。因此,cd
是一个内置的shell,用于避免启动子进程。
Linux内核存储每个进程的当前目录。您可以在/ proc文件系统中查找它(例如,init进程的“/ proc/1/cwd”)。
当前目录可以使用chdir
系统调用进行更改,并使用getcwd
进行检索。
当前目录是获取由该过程创建的进程继承了一个正在运行的程序(过程)的属性。通过操作系统调用更改当前目录。该shell将cd
操作映射到该系统调用。当你编写一个像ls
这样的外部程序时,该程序将继承当前目录。
$PWD
变量是shell如何显示当前目录以供您在需要时使用它作为变量。更改它在shell本身的当前实际目录中不起作用。
这正是正确的答案。 – Ian 2010-09-08 23:25:25