【问题标题】:Failing script as process substitution not working in Dart失败的脚本作为进程替换在 Dart 中不起作用
【发布时间】:2022-04-18 23:13:41
【问题描述】:

有什么方法可以制作脚本:

diff <(echo 'hello') <(echo 'hello-2')

工作,因为目前在使用 Process.runProcess.start 运行时它在 Dart 中失败并出现错误:

意外标记 `(' 附近的语法错误

我试图深入研究它,发现由于通过Process.runProcess.start 运行脚本时进程替换不可用,因此它失败了。那么,有什么方法可以让它发挥作用吗?

我发现如果不是,我们需要使用set +o posix 来提供进程替换,但我不知道如何在 Dart 中做到这一点。

【问题讨论】:

  • 我认为它不是yq 问题,如果它在命令行上按预期工作。您可能需要检查甜瓜部分
  • 是的,我发现了根本原因并更新了问题。试图为此找到解决方案。
  • @Aakash 你找到解决方案了吗?
  • 是的,所以我将命令用双引号括起来,它起作用了。
  • @Aakash 不太确定我理解哪一部分)你有代码示例吗?)

标签: bash flutter dart unix sh


【解决方案1】:

根据the documentation 和普遍的预期,shell 将是/bin/sh;因此,您不能使用诸如进程替换之类的 Bash 功能。

你总是可以通过显式运行 Bash 来强制它:

Process.run("bash", ["-c", "diff <(echo 'hello') <(echo 'hello-2')"])

您可以将set +o posix; 添加到bash -c 的参数开头(参数可以是具有多个命令的任意复杂字符串),但当然,这里没有必要,实际上在这种情况下是一个红鲱鱼。

这是一个稍微复杂的命令示例,它使用 Bash-only “C 风格”for 循环语法。

Process.run("bash", ["-c", "for ((i=0; i<=255; i++)); do ping -c 3 10.9.8.$i || break; done; echo 'finished'"])

...虽然一般来说,最好让您的子流程尽可能简单,并用宿主语言编写任何必要的管道。

或许也可以看看Difference between sh and bash

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多