Можно ли вкладывать вызовы команд в оболочку Scala Ammonite?

Я пытаюсь преобразовать типичную команду UNIX jmap -heap $(pgrep java) в команду для Ammonite-Shell.

Моя попытка до сих пор: %'jmap("-heap", %'pgrep("java")).

Я получаю сообщение об ошибке SyntaxError: found "%'jmap(\"-heap\", %'pg", expected "while" | ... которое, по-видимому, указывает на то, что внутренний вызов pgrep на самом деле не был переведен как командный вызов, а просто передан в виде строки.


person bbarker    schedule 30.12.2016    source источник


Ответы (1)


В Ammonite одиночный % порождает подпроцесс и выводит его результат. Чтобы получить доступ к выводу команды, вам нужно использовать оператор %%, который вернет объект CommandResult. Этот объект содержит поле out, которое является потоком его вывода.

Вы можете вложить это следующим образом:

%jmap("-heap", (%%pgrep("java")).out.lines.take(1))
person adamwy    schedule 30.12.2016
comment
Выглядит правильно, но я получаю %%pgrep("java"), уступая ammonite.ops.ShelloutException: CommandResult 1, что кажется странным; когда я запускаю его в tcsh, я получаю нулевой код выхода. Я также получаю InteractiveShelloutException при запуске только %pgrep("java"), что, похоже, подтверждает ненулевой статус выхода из аммонита. - person bbarker; 31.12.2016
comment
Странно, этот подпроцесс что-нибудь выводит в Ammonite? - person adamwy; 31.12.2016
comment
Я попробовал это сегодня, и это сработало ... не уверен в разнице, но, возможно, он пытался подключиться к процессу Java, к которому у него не было доступа. - person bbarker; 01.01.2017
comment
Оказывается, проблема заключалась в том, что pgrep во FreeBSD работает по-другому, вам нужно pgrep -a, чтобы увидеть предков. - person bbarker; 06.01.2017