【问题标题】:How to expand {} from xargs in process substitution?如何在进程替换中从 xargs 扩展 {}?
【发布时间】:2021-05-14 13:54:56
【问题描述】:

我尝试使用gap 4.10 版和xargs 如下:

$ echo 1 | xargs -I '{}' gap -b <( echo 'Display("{}");' ) <( echo 'QUIT;')

返回

{}

不过应该​​是

1

以下作品

$ gap -b <( echo 'Display("123");' ) <( echo 'QUIT;')
123

如果您没有gap v4.10,可以将gap 替换为cat 仍然可以看到我的问题:

$ echo 1 | xargs -I '{}' cat <( echo 'Display("{}");' ) <( echo 'QUIT;')
Display("{}");
QUIT;

如何实现返回值变成?

Display("1");
QUIT;

在我看来,这与gap无关,而是shell中xargs和process substitution的组合。我有zsh 5.7.1GNU bash 5.0.3 可用。 xargs 是GNU version 4.8.0

注意事项:

  • 我的动机是我想在 shell 中使用不同的参数并行运行一个 gap 脚本。
  • gap 4.10 版还没有-c &lt;expr&gt; (commit) 选项,它可以让我避免使用进程替换。但是,在计算服务器上,只有 4.10.0 版本的差距。

【问题讨论】:

    标签: shell xargs gap-system


    【解决方案1】:

    进程替换本身解析为文件名,而不是变电站内命令的输出:

    $ echo <(echo foo)
    /dev/fd/63
    

    因此,xargs 永远不会看到{}。它从标准输入中读取1,但xargs 的所有参数都不包含{},因此不会发生替换。剩下的就是给gap 打一个电话

    gap -b /dev/fd/63 /dev/fd/62  # The exact paths may differ
    

    gap,AFAICT,只是从这些文件中读取命令并执行它们。

    如果你想执行命令Display("1"),你需要先构造那个,然后执行结果。类似的东西

     # Adjust gap as needed to read from standard input.
    echo 1 | xargs -I '{}' echo 'Display("{}"); Quit;' | gap
    

    【讨论】:

    • 感谢您的回答。这对我帮助很大。
    【解决方案2】:

    正如@chepner 所指出的,进程替换由 shell 在 xargs 执行其 {} 替换之前执行,因此 xargs 永远不会看到 {}。

    如下创建一个shell命令为我解决了这个问题:

    echo 1 | xargs -I '{}' zsh -c "gap -b <( echo 'Display(\"{}\");' ) <( echo 'QUIT;')"
    

    【讨论】:

    • 以防万一,carpentries-incubator.github.io/gap-lesson/discuss 有另一种情况,即有一个调用 GAP 的 shell 脚本(滚动到“提示和技巧”)。在服务器上,可以安装自己的 GAP 吗? GAP 4.10.0 版本日期为 2018 年 11 月,超过 2 年。
    • 感谢分享链接,这也很有帮助。实际上,可以将其添加为该问题的另一个答案。关于gap版本:我尝试用linuxbrew在服务器上安装我自己的gap(4.11.1版)。编译成功,但是当我调用$ ~/.linuxbrew/bin/gap 时,我收到错误Illegal instruction。我不确定从哪里开始寻找这里的原因。非法指令不是一个非常具体的信息。
    • 从未使用过 linuxbrew - 你的意思是说你可以使用github.com/gap-system/homebrew-gap 和 linuxbrew 在 Linux 上安装 - 如果是这样,那就太好了!如果它不起作用,请尝试按照gap-system.org/Releases/4.11.1.html 的说明从源代码安装。如果这不起作用,最好通过电子邮件向GAP Support 寻求帮助(无论如何我都会在那里看到)。
    • P.S.我认为 GAP Carpentries 风格课程的配方与stackoverflow.com/questions/13418849/… 相同
    • 嗨嗨嗨。我昨天晚上也注意到了这一点。在我的辩护中,那是很久以前的事了,它已经在我的记忆中消失了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2018-07-30
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多