Как выполнить команду java jshell как встроенную из оболочки или командной строки Windows

Есть ли способ выполнить команду java в REPL (jshell) как встроенную команду, не запуская ее?

Например. Встроенная команда Perl

$perl -e 'printf("%06d", 19)'
000019

Мне нужно запустить jshell, чтобы выполнить любую команду:

$jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro
jshell> String.format("%06d", 19)
$1 ==> "000019"

Я нашел аналогичный вопрос здесь, но создать отдельный jsh невозможно. файл для отдельной команды.

Другое решение в том же сообщении: echo "1+2"|jshell

temp=`echo 'String.format("%06d", 19)'|jshell`
echo $temp

Отличный результат

| Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell> String.format("%06d", 19) $1 ==> "000019" jshell>

Я ожидаю, что $temp напечатает только 000019.


person Rahul Sharma    schedule 14.10.2017    source источник
comment
Возможный дубликат Как запустить файл JShell?   -  person Naman    schedule 14.10.2017
comment
Спасибо за предложение. Я проверил предложенный пост, невозможно создать отдельный файл для отдельной команды. Можно иметь n количество команд для выполнения в разных местах.   -  person Rahul Sharma    schedule 14.10.2017
comment
Один из ответов в том же сообщении предлагает использовать echo и не требует сценария. Вы пробовали это? команды для выполнения в разных местах. что здесь означают разные места?   -  person Naman    schedule 14.10.2017
comment
Я пробовал, но ответа не ожидается. пожалуйста, проверьте сообщение.   -  person Rahul Sharma    schedule 14.10.2017
comment
Я пытаюсь $temp назначить только 3 и исключить остальную информацию. Есть ли возможность пропустить jshell для печати информации о версии?   -  person Rahul Sharma    schedule 14.10.2017
comment
Давайте продолжим обсуждение в чате.   -  person Rahul Sharma    schedule 14.10.2017


Ответы (2)


По умолчанию при взаимодействии с JShell используется режим обратной связи normal, и этот режим печатает вывод команды, объявление, команды и подсказку. Прочтите Введение в режимы обратной связи jshell для более подробной информации.

Шаги для получения вывода команды:

  1. Запустите jshell в режиме обратной связи concise, чтобы пропустить детали команды и объявления, он по-прежнему будет печатать приглашение и значение.

     $ echo 'String.format("%06d", 19)' | jshell --feedback concise
       jshell> String.format("%06d", 19)
       $1 ==> "000019"
    
  2. Отфильтровать 2-ю строку из результата, используя sed-

    echo 'String.format("%06d", 19)' | jshell --feedback concise | sed -n '2p'
    
  3. Извлеките только значение и исключите другие детали.

    echo 'String.format("%06d", 19)' | jshell --feedback concise | sed -n '2p' |sed -En 's/[^>]*>(.+)/\1/gp'
    
person Rahul Sharma    schedule 14.10.2017
comment
Уверен, что это работает в командной строке Windows CMD/PowerShell? Я тестировал Windows 10, JDK11 и не работал: JShell открывается, но зависает при выполнении команды jshell>. Ни один из них не работает с WSL. - person lucasvc; 29.01.2020

Если вы используете System.out.println, второй sed вам не понадобится.

echo "System.out.println(\"$JAVA_HOME\");" | jshell --feedback concise | sed -n '2p'
person Maruthi    schedule 29.01.2019