我尝试过此代码,但不适用于用户输入目录。 它仅列出PWD。 救命!
#script to list the directory contents of a user specified directory
system("pwd");
print "enter the path of your d1rectory\n";
$path =<STDIN>;
system(" cd Spath");
#system ("chdir $path");
system("ls");
答案 0 :(得分:3)
Unix进程具有与之关联的“环境”。该环境包含有关流程运行方式的详细信息。例如,环境的要素之一就是当前的工作目录。
当一个进程启动另一个进程时,新的子进程将从父进程继承环境的副本。子进程可以更改其环境副本中所需的任何内容,但不能更改父环境的副本(或者至少不容易)。
您的代码涉及四个过程。调用system()
时会创建一个新进程,并带有新的环境副本。当每个对system()
的调用退出时,其环境将不复存在。
system()
会创建一个新进程,并为其提供主程序环境的副本。该子进程运行pwd
并退出。它的环境副本消失了。system()
的调用将创建另一个新进程,并为其提供主程序环境的新副本。该子进程将更改其当前工作目录-但仅用于其环境副本。当退出对system()
的调用时,该环境副本(具有更改后的当前工作目录)将不复存在。system()
的最终调用将创建另一个新进程,并为其提供主程序环境的新副本(该副本仍具有原始程序的当前工作目录)。该进程在其当前目录上调用ls
,然后退出-删除进程中的环境。因此,实际上,您对cd
的调用没有任何作用,因为它会在立即不存在的环境中更改目录。
快速的解决方案(如您所示)是将$path
变量传递给ls
。
正确的解决方案(如您所显示的)是不要使用子流程来执行此操作,而应使用Perl的内置工具。
当我看到这样的问题时,我不得不想知道这些天他们在计算机课程上的教学内容:-)
答案 1 :(得分:-1)