【问题标题】:Is it possible to nest command calls in the Scala Ammonite shell?是否可以在 Scala Ammonite shell 中嵌套命令调用?
【发布时间】:2017-05-14 08:57:30
【问题描述】:

我正在尝试将典型的 UNIX 命令jmap -heap $(pgrep java) 转换为Ammonite-Shell 的命令。

到目前为止我的尝试:%'jmap("-heap", %'pgrep("java"))

我收到错误 SyntaxError: found "%'jmap(\"-heap\", %'pg", expected "while" | ... 这似乎表明对 pgrep 的内部调用实际上并未转换为命令调用,而是作为字符串传入。

【问题讨论】:

    标签: scala ammonite


    【解决方案1】:

    在 Ammonite 中,单个 % 生成一个子进程并打印出其结果。为了访问命令输出,您需要使用%% 运算符,它将返回CommandResult 对象。此对象包含out 字段,它是其输出流。

    你可以这样嵌套它:

    %jmap("-heap", (%%pgrep("java")).out.lines.take(1))
    

    【讨论】:

    • 看起来不错,但我得到%%pgrep("java") 产生ammonite.ops.ShelloutException: CommandResult 1,这似乎很奇怪;当我在 tcsh 中运行它时,退出代码为零。当我只运行%pgrep("java") 时,我也会得到一个InteractiveShelloutException,这似乎证实了ammonite 的非零退出状态。
    • 奇怪,这个子进程在 Ammonite 中输出什么东西吗?
    • 我今天试了一下,它工作了......不确定有什么区别,但也许它试图附加到它无权访问的 java 进程。
    • 原来,问题是 FreeBSD pgrep 的工作方式不同,您需要“pgrep -a”才能看到祖先。
    猜你喜欢
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2019-11-15
    • 2010-12-19
    • 2020-02-16
    相关资源
    最近更新 更多