如何使用perl进入目录?

时间:2011-08-10 10:07:01

标签: linux perl ubuntu terminal

我正在尝试以下...... 系统“cd directoryfolder” 但它失败了,我也尝试系统“退出”离开终端,但它失败了。

3 个答案:

答案 0 :(得分:25)

代码:

chdir('path/to/dir') or die "$!";

的Perldoc:

   chdir EXPR
   chdir FILEHANDLE
   chdir DIRHANDLE
   chdir   Changes the working directory to EXPR, if possible. If EXPR is omitted,
           changes to the directory specified by $ENV{HOME}, if set; if not, changes to
           the directory specified by $ENV{LOGDIR}. (Under VMS, the variable
           $ENV{SYS$LOGIN} is also checked, and used if it is set.) If neither is set,
           "chdir" does nothing. It returns true upon success, false otherwise. See the
           example under "die".

           On systems that support fchdir, you might pass a file handle or directory
           handle as argument.  On systems that don't support fchdir, passing handles
           produces a fatal error at run time.

答案 1 :(得分:14)

通过调用system无法执行这些操作的原因是system将启动新进程,执行命令并返回退出状态。因此,当您调用system "cd foo"时,您将启动一个shell进程,该进程将切换到“foo”目录然后退出。在perl脚本中不会发生任何后果。同样,system "exit"将启动一个新流程并立即再次退出。

你想要的cd案例,就像bobah指出的那样 - 函数chdir。要退出程序,有一个函数exit

但是 - 这些都不会影响您所在的终端会话的状态。在perl脚本完成后,终端的工作目录将与您开始之前的工作目录相同,并且您将无法退出通过在perl脚本中调用exit来终止会话。

这是因为你的perl脚本又是一个与你的终端shell分开的进程,在不同的进程中发生的事情通常不会相互干扰。这是一个功能,而不是错误。

如果您希望在shell环境中更改内容,则必须发出shell理解和解释的说明。 cd是shell中的内置命令,exit也是如此。

答案 2 :(得分:4)

我总是喜欢cd提及"wget download.com/download.zip"; system "unzip download.zip" chdir('download') or die "$!"; system "sh install.sh"; 。它允许更改封闭块本地的工作目录。

正如Peder所提到的,你的脚本基本上都是与Perl捆绑在一起的所有系统调用。我提出了更多的Perl实现。

#!/usr/bin/env perl

use strict;
use warnings;

use LWP::Simple; #provides getstore
use File::chdir; #provides $CWD variable for manipulating working directory
use Archive::Extract;

#download
my $rc = getstore('download.com/download.zip', 'download.zip');
die "Download error $rc" if ( is_error($rc) );

#create archive object and extract it
my $archive = Archive::Extract->new( archive => 'download.zip' );
$archive->extract() or die "Cannot extract file";

{
  #chdir into download directory
  #this action is local to the block (i.e. {})
  local $CWD = 'download';
  system "sh install.sh";
  die "Install error $!" if ($?);
}

#back to original working directory here

变为:

Archive::Extract

这使用了两个非核心模块(而且cpan自Perl v5.9.5以来只是核心)所以你可能需要安装它们。使用ppm实用程序(或AS-Perl上的{{1}})执行此操作。