【问题标题】:GNU parallel with Perl expression; zsh: parse error near `}'GNU 与 Perl 表达式并行; zsh: `}' 附近的解析错误
【发布时间】:2018-04-08 07:16:00
【问题描述】:

尝试运行这个示例命令(来自手册页):

seq 10 | parallel echo {} + 1 is {= '$_++' =}

我得到了错误

zsh: parse error near `}'

如何解决此问题并在并行命令中使用 {=<i>perl expression</i>=} 替换字符串?

我在 macOS 上的 iTerm 2 中,使用 zsh。

【问题讨论】:

  • 你可以试试—parens ,,,,,然后使用,, ‘$_++’ ,,
  • @MarkSetchell 哇,第一次完美运行。您想将其添加为答案吗?
  • 我认为@chepner 的解决方案比我的更好、更清晰,但当我回到电脑附近时,可能会将其添加为答案。我投票给他;-)
  • @MarkSetchell chepner 没有用。我没有告诉他们这不起作用,因为他们删除答案太快了,所以也许他们自己想通了。我应该添加你的评论作为答案还是等你?我不太确定礼仪。
  • 继续把它作为答案——不客气。当我正在建造一张新桌子并装饰我的办公室时,我有点离线 - 叹息!

标签: bash macos perl zsh gnu-parallel


【解决方案1】:

与任何命令一样,引用 zsh 如果不加引号将尝试解​​释自身。

seq 10 | parallel 'echo {} + 1 is {= $_++ =}'

在这种情况下,parallel 只是将各种元素连接成一个字符串,然后对其进行自己的解析,然后将结果传递给 shell;你也可以只传递一个字符串来开始。

【讨论】:

  • 更一般地说,=} 似乎是 zsh 特别对待的东西;引用一下就足够了:seq 10 | parallel echo {} + 1 is {= '$_++' '=}'。碰巧parallel 并不关心它是接收一个带有嵌入空格的参数还是多个参数,但其他命令可能会。
  • 啊,对;它试图将=} 扩展为在PATH 目录中找到} 的完整路径。不过,原则上,您不希望此表达式中的任何内容受到 shell 扩展的影响,因此您不妨明确说明要传递给 parallel 的内容。
  • 这是一个品味问题,但我会这样写:seq 10 | parallel echo '{}' + 1 is '{= $_++ =}'
【解决方案2】:

(感谢@MarkSetchell

这对我来说非常有效:

seq 10 | parallel --parens ,,,, echo {} + 1 is ,, '$_++' ,,

--parens 设置为,,,,,然后将perl 表达式引用为,,<i>perl expression</i>,,

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 2022-11-05
    • 2017-06-10
    • 2019-03-25
    相关资源
    最近更新 更多