Как мне перейти в каталог с помощью Perl? - PullRequest
6 голосов
/ 10 августа 2011

Я пытаюсь следующее .. системная "папка каталога cd", но она не работает, также я пытаюсь системно "выйти", чтобы выйти из терминала, но она не работает.

Ответы [ 3 ]

25 голосов
/ 10 августа 2011

Код:

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.
14 голосов
/ 10 августа 2011

Причина, по которой вы не можете сделать это, вызвав system, заключается в том, что system запустит новый процесс, выполнит вашу команду и вернет статус выхода.Поэтому, когда вы вызываете system "cd foo", вы запускаете процесс оболочки, который переключается в каталог «foo» и затем завершается.В вашем скрипте perl ничего не случится.Точно так же, system "exit" запустит новый процесс и сразу же выйдет из него снова.

То, что вы хотите для случая cd, это - как указывает Боба - функция chdir.Для выхода из вашей программы есть функция exit.

Однако - ни один из них не повлияет на состояние сеанса терминала, в котором вы находитесь. После завершения вашего сценария perl рабочий каталог вашего терминала будеткак и прежде, и вы не сможете выйти из сеанса терминала, вызвав exit в вашем скрипте perl.

Это потому, что ваш скрипт perl снова является отдельным процессом от вашей терминальной оболочки,и вещи, которые происходят в отдельных процессах, как правило, не мешают друг другу.Это функция, а не ошибка.

Если вы хотите, чтобы что-то изменилось в вашей оболочке, вы должны дать инструкции, понятные и интерпретируемые вашей оболочкой.cd - это такая встроенная команда в вашей оболочке, как exit.

4 голосов
/ 11 августа 2011

Мне всегда нравится упоминание File::chdir для cd -ing. Это позволяет вносить изменения в рабочий каталог, которые являются локальными для включающего блока.

Как упоминает Педер, ваш скрипт - это в основном все системные вызовы, связанные с 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 (i.e. {})
  local $CWD = 'download';
  system "sh install.sh";
  die "Install error $!" if ($?);
}

#back to original working directory here

При этом используются два неосновных модуля (а Archive::Extract был основным только с Perl v5.9.5), поэтому вам, возможно, придется их установить. Для этого используйте утилиту cpan (или ppm в AS-Perl).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...