代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

Perl system()调用使用哪个shell?

  •  10
  • Aakash Goel  · 技术社区  · 14 年前

    我正在使用系统调用来执行一些任务

    system('myframework mycode');
    

    但它抱怨缺少环境变量。 这些环境变量是在bash shell中设置的(在这里我运行Perl代码)。

    我做错什么了?

    是不是 system 调用create a brand new shell(不带环境变量设置)?我怎样才能避免呢?

    7 回复  |  直到 14 年前
        1
  •  18
  •   Matt K    14 年前

    这很复杂。Perl不一定调用shell。 Perldoc 说:

    如果只有一个标量参数,则检查该参数是否有shell元字符,如果有,则将整个参数传递给系统的命令shell进行解析(在Unix平台上是/bin/sh-c,但在其他平台上有所不同)。如果参数中没有shell元字符,则将其拆分为单词并直接传递给execvp,这样效率更高。

    所以看起来你应该把参数传递给execvp。此外,shell是否加载了.bashrc、.profile或.bash_配置文件取决于shell是否是交互式的。可能不是,但你可以检查一下 this .

        2
  •  4
  •   glenn jackman    14 年前

    如果不想调用shell,请调用 system 有一个列表:

    system 'mycommand', 'arg1', '...';
    system qw{mycommand arg1 ...};
    

    如果需要特定的shell,请显式调用它:

    system "/path/to/mysh -c 'mycommand arg1 ...'";
    
        3
  •  4
  •   berekuk    14 年前

    我认为这不是shell选择的问题,因为环境变量是 总是 除非显式清理,否则由子进程继承。 您确定已导出变量吗? 这将起作用:

    $ A=5 perl -e 'system(q{echo $A});'
    5
    $
    

    这也会起作用:

    $ export A=5
    $ perl -e 'system(q{echo $A});'
    5
    $
    

    这不会:

    $ A=5
    $ perl -e 'system(q{echo $A});'
    
    $
    
        4
  •  3
  •   jim mcnamara    14 年前

    system()将/bin/sh作为shell调用。如果您使用的是一个类似于ARM的盒子,那么最好阅读exec调用系列的手册页——默认行为。如果需要,可以调用.profile,因为system()接受一个命令

    system(" . myhome/me/.profile && /path/to/mycommand")
    
        5
  •  3
  •   neuhaus    5 年前

    我为此奋斗了两天。在我的例子中,环境变量是在linux下正确设置的,而不是cygwin。

    mkb's 我想退房的答案 man perlrun 它提到一个变量 PERL5SHELL ( 特定于Win32端口 ). 然后,以下内容解决了问题:

    $ENV{PERL5SHELL} = "sh";
    

    通常情况下,我只能说“这对我很管用”,尽管文档确实暗示这可能是一个明智的解决方案:

    可以设置为另一个shell,perl必须在内部使用它来执行“backtick”命令或system()。

    如果perl使用的shell没有隐式继承环境变量,则不会为您设置它们。

        6
  •  1
  •   Community paulsm4    7 年前

    我搞乱了为脚本设置的环境变量 this post 我需要设置env变量$DBUS_SESSION_BUS_ADDRESS,但当我将脚本作为根调用时,它不会这样做。您可以通读,但最后可以检查%ENV是否包含所需的变量,如果不包含,则可以添加它们。

    perlvar

       %ENV
       $ENV{expr}
               The hash %ENV contains your current environment.  Setting a value in "ENV" changes
               the environment for any child processes you subsequently fork() off.
    

    我的问题是,我在sudo下运行脚本,但这并没有保留所有用户的env变量,您是在sudo下运行脚本,还是作为其他用户(比如www data(apache))运行脚本?

    简单测试:

    user@host:~$ perl -e 'print $ENV{q/MY_ENV_VARIABLE/} . "\n"'
    

    如果不起作用,则需要将其添加到脚本顶部的%ENV中。

        7
  •  0
  •   sud03r    14 年前

    尝试 system("echo \$SHELL"); 在你的系统上。