我正在尝试以下..系统“CD目录文件夹”,但它失败了,我也尝试系统“退出”离开terminal,但它失败。
码:
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.
你不能通过调用system
来做这些事情的原因是system
将启动一个新的进程,执行你的命令,并返回退出状态。 所以当你调用system "cd foo"
你将启动一个shell进程,它将切换到“foo”目录,然后退出。 在你的perl脚本中没有任何后果。 同样, system "exit"
将启动一个新的进程,并立即退出。
你想要的CD盒,是 – 正如bobah指出的 – 功能chdir
。 退出你的程序,有一个功能exit
。
但是,这些都不会影响你所在终端会话的状态。在你的perl脚本完成后,你的终端的工作目录将和你启动之前一样,并且你将不能退出终端会话。在你的perl脚本中调用exit
。
这是因为你的perl脚本又是一个独立于你的终端shell的进程,而在不同进程中发生的事情通常不会相互干扰。 这是一个功能,而不是一个错误。
如果你想在你的shell环境中改变一些东西,你必须发出你的shell能够理解和解释的指令。 cd
是你的shell中的一个内置命令,就像exit
。
我总是喜欢提到的File::chdir
cd
-ing。 它允许更改封闭块本地的工作目录。
正如Peder所提到的,你的脚本基本上都是与Perl系统调用绑定在一起的。 我介绍更多的Perl实现。
"wget download.com/download.zip"; system "unzip download.zip" chdir('download') or die "$!"; system "sh install.sh";
变为:
#!/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 (ie {}) local $CWD = 'download'; system "sh install.sh"; die "Install error $!" if ($?); } #back to original working directory here
这使用了两个非核心模块( Archive::Extract
从Perl v5.9.5开始只是核心),所以你可能需要安装它们。 使用cpan
实用程序(或AS-Perl上的ppm
)来执行此操作。