【问题标题】:system() call in perl [duplicate]perl中的system()调用[重复]
【发布时间】:2014-10-01 19:33:04
【问题描述】:

我想在 perl 脚本中进行 system() 调用,因为我想重定向 stdinstdout,我想我需要将单个字符串传递给 system() 并让 shell 解释元字符。但是,我似乎无法正确检测到程序何时通过system() segfaults 调用。

http://perldoc.perl.org/functions/system.html 的 perl system() 手册页警告“当系统的参数由 shell 间接执行时,结果和返回码受制于它的怪癖。”我应该担心这个吗?

我用于测试 system() 的返回值的代码与同一手册页上给出的示例几乎相同(就在我提到的警告上方),但回想起来似乎是用 LIST 调用 system() .

所以,我认为我的核心问题是,我如何检测从 perl 的system() 在 shell 中调用的程序是如何终止的。如果这是一个重复的问题,我深表歉意,但我在以前的任何地方都找不到它。 FWIW 我在 Linux 的 Fedora 发行版上运行脚本。

非常感谢。

【问题讨论】:

    标签: linux perl shell


    【解决方案1】:

    我建议你看看IPC::Open2IPC::Open3

    对于system 而言,您尝试做的事情有点过于复杂,它或多或少地适合运行命令,然后捕获输出。

    IPC::Open2 允许您打开进程的 exec 管道,并将您自己的文件句柄附加到 STDINSTDOUT,这意味着您可以进行双向通信。 (Open3 也允许STDERR)。

    在您的附加进程中捕获信号和错误有点复杂 - 您相当唯一确定得到的是返回码。对于系统,$? 应该自动设置,但对于IPC::Open[23],您可能需要使用waitpid 来捕获返回码。

    【讨论】:

    • 他们太低级了! IPC::Run3 和 IPC::Run 更容易使用。
    猜你喜欢
    • 2012-10-25
    • 2011-05-12
    • 1970-01-01
    • 2011-03-29
    • 2013-12-16
    • 2012-08-12
    • 2011-04-15
    • 1970-01-01
    • 2018-05-08
    相关资源
    最近更新 更多