1

我尝试使用gap4.10 版本xargs,如下所示:

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

返回

{}

但是,应该是

1

以下作品

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

如果您没有gapv4.10,您可以替换gapcat并仍然看到我的问题:

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

我怎样才能实现返回值变成?

Display("1");
QUIT;

从我的角度来看,这与 gap 无关,而是 xargs 和shell 中的进程替换的组合。我有zsh 5.7.1GNU bash 5.0.3可用。xargs 是GNU 版本 4.8.0

笔记:

  • 我的动机是我想与 shell 的不同参数并行运行一个间隙脚本。
  • gap4.10 版还没有允许我避免使用进程替换的选项-c <expr>commit )。但是,在计算服务器上,只有差距版本 4.10.0。
4

2 回答 2

2

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

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

结果,xargs再也见不到了{}1它从其标准输入中读取,但没有xargs包含 a的参数{},因此不会发生替换。你剩下的就是一个gap喜欢的电话

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

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

如果要执行 command Display("1"),则需要先构造它,然后执行结果。就像是

 # Adjust gap as needed to read from standard input.
echo 1 | xargs -I '{}' echo 'Display("{}"); Quit;' | gap
于 2021-05-13T18:29:18.967 回答
1

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

创建如下shell命令为我解决了它:

echo 1 | xargs -I '{}' zsh -c "gap -b <( echo 'Display(\"{}\");' ) <( echo 'QUIT;')"
于 2021-05-13T21:15:12.277 回答