0

我正在用 perl 编写一个带有嵌入式 shell 脚本的代码:

#!/usr/bin/perl

use strict;
use warnings;

our sub main {

    my $n;
    my $n2=0;


    $n=chdir("/home/directory/");

    if($n){
        print "change directory successful $n \n";

        $n2 = system("cd", "section");
        system("ls");
        print "$n2 \n";
    }
    else {
        print "no success $n \n";
    }
    print "$n\n";
}

main();

但它不起作用。当我做 ls. ls 不显示新文件。任何人都知道另一种方法。我知道我可以使用 chdir(),但这不是唯一的问题,因为我创建了其他命令,它们只是组合在一起的 shell 命令。那么有谁知道如何在 perl 中准确地使用 cli,这样我的编译器就会将 shell 脚本附加到同一个进程,而不是为每个系统创建一个新进程……我真的不知道该怎么做。

编辑已用于改进问题。如果问题很清楚,请不要介意编辑。编辑:暴民提出的要点是系统是一个单一的进程,所以它每次都会死掉。但是,我想做的是创建一个 perl 脚本,该脚本遵循决定 shell 脚本控制流的算法。那么如何让所有这些 shell 命令遵循相同的过程呢?

4

2 回答 2

2

system产生一个新进程,并且当进程退出时,对新进程的环境所做的任何更改都会丢失。因此调用system("cd foo")会将目录更改为foo非常短暂的进程内部,但不会对当前进程或任何未来的子进程产生任何影响。

要执行您想要执行的操作 (*),请将您的命令组合到一个系统调用中。

$n2 = system("cd section; ls");

如有必要,您可以使用 Perl 丰富的引用功能来传递更长的命令序列。

$n2 = system q{cd section
if ls foo ; then
  echo we found foo in section
  ./process foo
else
  echo we did not find foo\!
  ./create_foo > foo
fi};

$n2 = 系统 << "EOSH"; cd section ./process bar > /tmp/log cd ../sekshun ./process foo >> /tmp/log if grep -q Error /tmp/log ; 然后回显有错误... fi EOSH

(*) 当然有一些简单的方法可以完全在 Perl 中完成,但我们假设 OP 最终将需要一些仅在外部程序中可用的功能

于 2013-07-09T17:53:02.520 回答
1

system("cd", "section");尝试执行程序cd,但您的机器上没有这样的程序。

没有这样的程序是因为每个进程都有自己的当前工作目录,一个进程不能改变另一个进程的当前工作目录。(如果可能,程序会左右出现故障。)

看起来您正试图让 Perl 程序执行 shell 脚本。这需要在 Perl 中重新创建 shell。(更具体的目标可能有更简单的解决方案。)


我要做的是创建一个 perl 脚本,该脚本遵循决定 shell 脚本控制流的算法。

最小的变化:

创建一个提示输入指令/命令的 shell 脚本。让您的 Perl 脚本使用Expect启动 shell 脚本并为其提供答案/命令。

于 2013-07-09T18:39:18.893 回答