【问题标题】:Why does calling Perl's exec builtin cause this function not to return to its caller?为什么调用 Perl 的 exec 内建函数会导致这个函数不返回给它的调用者?
【发布时间】:2010-11-07 12:24:36
【问题描述】:

我在将参数传递给函数并且被调用函数没有将控制权返回给最初调用它的函数时遇到问题。基本上,我正在读取一个包含用户名和密码的文本文件到一个数组中。然后使用 foreach 循环,我将用户名和密码传递给另一个函数,但这永远不会返回并且只针对一组参数执行;

sub batch {
    open(my $in, "<", "$ARGV[0]") or die "Can't open $ARGV[0]: $!";
 #Read file contents into an array.
 @listOfUsers = <$in>;
 foreach $listOfUsers (@listOfUsers) {
  #Regex to check if txt file conforms to correct syntax.
  if ($listOfUsers !~ /([a-zA-Z]{1}[a-zA-Z0-9]{3,40})\s[a-zA-Z]{1}[a-zA-Z0-9]{3,40}/) {
   print "Please ensure that line $listOfUsers in $ARGV[0] is of the following syntax:\n";
   print "\n<USERNAME> <PASSWORD>\n";
   exit(0);
  } else {
   #split string and call AddUser function
   my ($username, $password) = split(" ",$listOfUsers);
   AddUser($username, $password);
  }
 }
}



sub AddUser {
 exec("infacmd.sh createUser -dn domain -un user -pd pass -hp domain:80 -nu " . $_[0] . " -np " . $_[1] . " -nf test");
}

基本上,不用担心 AddUser 函数的作用。它只是运行一些 .sh 文件来执行一些我不关心的事情。目前,我只能从我读入的文件中添加一个用户。即此代码只运行一次,不会返回到“批处理”函数。

我尝试在“AddUsers”函数的末尾添加“return()”,但这没有帮助

谢谢

【问题讨论】:

    标签: perl function exec return


    【解决方案1】:

    exec 永不返回。与 UNIX C 中的等效调用系列一样,它用您指定的进程替换当前进程。你想要system

    从那些页面:

    exec:
    exec 函数执行系统命令永不返回;如果您希望它返回,请使用 system 而不是 exec。仅当命令不存在并且直接执行而不是通过系统的命令 shell 执行时,它才会失败并返回 false。

    system:
    exec做的一模一样,只是先做一个fork,父进程等待子进程退出。


    如果要捕获程序的标准输出,可以使用open-with-pipe 变体:

    open (HNDL, "myprogram |") || die "Cannot execute.";
    while (<HNDL>) {
        # Do something with each line.
    }
    close (HNDL);
    

    以下脚本显示了如何从特定命令(本例中为 ls -al xx*)中搜索包含特定字符串(本例中为 123)的行:

    pax> ls -al xx*
        -rw-r--r-- 1 pax None  10 2010-06-13 19:51 xx
        -rw-r--r-- 1 pax None 123 2010-05-05 23:39 xx.py
    
    pax> cat qq.pl
        open (HNDL, "ls -al xx* |") || die "Cannot execute.";
        while (<HNDL>) {
            if (/123/) {
                print;
            }
        }
        close (HNDL);
    
    pax> perl qq.pl
        -rw-r--r-- 1 pax None 123 2010-05-05 23:39 xx.py
    

    【讨论】:

    • 啊啊啊!!! 踢自己非常感谢你们。如果我想使用反引号来执行此命令怎么办?我希望能够捕获 .sh 命令的输出。 :)
    • @tchrist,我不完全确定这是必要的,因为从 sn-p 和其他答案中都应该很明显它不会返回。但是,如果您认为它会改善答案,当然,我会强调它。
    • @paxdiablo:我确实认为它会改善答案:你认为我为什么首先放入 perlfunc? :)
    • @microfly7:你永远都不想使用exec,除非你想丢弃当前正在运行的程序并链接到你exec的那个。通常,如果您想捕获程序的输出,则使用ˋbackticksˋ,如果您只关心程序的退出状态,则使用system
    • 哦,那个 tchrist - 我想我会向权威低头:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2019-12-08
    • 1970-01-01
    相关资源
    最近更新 更多