【问题标题】:How to ignore output for a parameterized Ruby system call如何忽略参数化 Ruby 系统调用的输出
【发布时间】:2019-10-21 04:49:04
【问题描述】:

我发现 some code 允许我通过系统调用从 Ruby 运行 Applescript:

system 'osascript', *script.split(/\n/).map { |line| ['-e', line] }.flatten

效果很好,但不是我需要的。

我想修改系统调用以忽略标准输出。

我从添加1>/dev/null参数开始:

system 'osascript', *script.split(/\n/).map { |line| ['-e', line] }.flatten, "1>/dev/null"

这不起作用,因为第三个参数似乎被忽略了。

然后我删除了参数化调用并使用了字符串插值:

system "osascript #{*script.split(/\n/).map { |line| ['-e', line] }.flatten} 1>/dev/null"

产生了语法错误。

然后我尝试了各种移动东西的尝试,但大多会产生其他语法错误。

在这种情况下忽略系统输出的正确语法是什么?

【问题讨论】:

    标签: ruby io-redirection


    【解决方案1】:

    systemexecspawn 的可用选项记录在 Kernel#spawn 中,包括用于重定向的选项。要将标准输出重定向到 /dev/null,您可以使用:

    system('...', out: '/dev/null')
    

    或通过File::NULL

    system('...', out: File::NULL)
    

    【讨论】:

    • 不幸的是我不能使用它,因为我的部分问题是如何传递正在完成的操作并使用 *script.split(/\n/).map { |line| ['-e', line] }.flatten 作为输入。每次我尝试将所有内容都放在一个字符串中(对应于您的“...”)时,语法都会让我感到困惑。我在我的帖子中的最后一次尝试中做了一半,只是没有使用您包含的重定向参数。不过很高兴知道
    【解决方案2】:

    如果您从 Kernel#system 切换到 Open3,这会更容易。 Open3 中的方法让您可以方便地控制 stdin、stdout 和 stderr,而不必乱七八糟,您甚至可以通过 stdin 将脚本输入osascript,而不是将其拆分并使用多个-e 开关。

    可能是这样的:

    out, error, status = Open3.capture3('osascript', stdin_data: script)
    

    如果你想忽略标准输出和标准错误,使用占位符变量:

    _, _, status = Open3.capture3('osascript', stdin_data: script)
    *_, status = Open3.capture3('osascript', stdin_data: script)
    

    如果您不关心标准输出、标准错误或状态:

    Open3.capture3('osascript', stdin_data: script)
    

    但你的良心应该告诉你至少检查一下状态。

    【讨论】:

    • 我之前实际上使用过 Open3,但没有尝试过,因为我认为 -e 开关是必要的,我不知道如何使用它。你告诉我我可以通过脚本直接到 Open3.capture3 没有任何操作或标志。我不知道它是否会对其他情况造成麻烦,但我可以确认它在使用 HEREDOC 创建多行电子邮件时有效 ?
    • 如果需要,您可以使用 *script.split(/\n/).map { |line| ['-e', line] }.flatten 技巧和 Open3.capture3Open3.capture3('osascript', *script.split(/\n/).flat_map { |line| ['-e', line] })`。
    • 它终于失败了,猜猜谁没有检查状态或std_err? --> 我。现在我必须等到它再次失败才能看到原因。我应该听听你所说的良心:D。其他人注意了!
    猜你喜欢
    • 2012-02-09
    • 2018-02-19
    • 2016-12-29
    • 2022-11-25
    • 2014-06-06
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多