【问题标题】:perl run two system commands errorperl 运行两个系统命令错误
【发布时间】:2012-07-03 13:10:50
【问题描述】:

因此,在我的脚本中,我需要调用 unix,并且我通过系统命令来执行此操作,如下所示:

system "bash -i -c 'addmothernode'";

...

perl code ...

...

system "bash -i -c 'addnode -ip=$_'";

但是,每当我在同一个脚本中运行这两个命令时,由于某种原因,我的进程会像这样停止:

[1]+  Stopped                 perl boot.pl

而脚本只有在我运行fg %1 时才能完成。当我只有其中一个系统调用时,perl 脚本成功完成。但我需要这两个命令,因为它们相互依赖。有人对发生的事情有任何想法吗?谢谢!

更新:

下面的很多答案都说我不需要使用bash -i 来运行系统命令,我通常知道这是真的,但我需要使用我创建的别名,如果我不使用它别名将无法识别。所以我确实需要bash -i

【问题讨论】:

    标签: perl unix command system


    【解决方案1】:
    system "addmothernode"; 
    

    应该可以。


    要执行命令,不需要 bash。 Perl 的system 函数类似于系统C 函数,默认调用sh

    man system

    exec

    调用者遵循的标准决定了使用哪个shell。见standards(5)

    Standard                                      Shell Used
    ______________________________________________________________
    1989 ANSI  C,  1990  ISO  C,  1999  ISO  C,   /usr/xpg4/bin/sh
    POSIX.1  (1990-2001),  SUS,  SUSv2,  SUSv3,
    XPG4
    POSIX.1 (1988), SVID3,  XPG3,  no  standard   /usr/bin/sh
    specified
    

    【讨论】:

      【解决方案2】:

      这个问题与 perl 无关。如果您在交互模式下(-i)一个接一个地启动两个 bash,您可以轻松重现这种情况:

      $ cat 1.sh 
      bash -i -c 'sleep 1'
      bash -i -c 'sleep 1'
      
      $ bash 1.sh
      
      [1]+  Stopped                 bash 1.sh
      

      当然最好在非交互模式下运行 bash(不带-i)或者直接运行程序,不带 bash,但是如果你出于某种原因需要bash -i,你可以用@保护它的运行987654325@:

      $ cat 1.sh
      setsid bash -i -c 'sleep 1'
      setsid bash -i -c 'sleep 1'
      echo done
      
      $ bash 1.sh
      done
      

      【讨论】:

      • 太棒了!!谢谢!我需要bash -i 在命令中运行我的别名。这正是我需要的:)
      • 很高兴为您提供帮助!另一个解决方案:bash -c '. ~/.bashrc ; echo done'。而不是echo done 必须是你的命令。
      【解决方案3】:

      bash -i 表示运行交互式 shell;所以你有两个 shell 都从终端读取。

      尝试删除 -i 选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-12
        • 2015-04-05
        • 2011-02-12
        • 2011-10-15
        • 2023-03-06
        • 2014-03-18
        • 2010-12-17
        • 1970-01-01
        相关资源
        最近更新 更多