次のようなJShellでファイル全体を実行したいと思います。
$ jshell my-jshell-skript.Java
例:私のmy-jshell-skript.Java
の内容は40 + 2;
です。
または、次のような実行可能ファイルもあります。
#!/usr/bin/jshell
40 + 2
これは今可能ですか、それともJava-Main-Classを古い方法で引き継ぐ必要がありますか?
Windowsでは、まだ解決策はありません。
C:\JDKs\jdk9.0.0.0_x64\bin>type foo.jsh
1 + 1
C:\JDKs\jdk9.0.0.0_x64\bin>jshell.exe foo.jsh
| Welcome to JShell -- Version 9
| For an introduction type: /help intro
jshell> /exit
| Goodbye
C:\JDKs\jdk9.0.0.0_x64\bin>
JShellは私のファイルを完全に無視し始めます。バグですか?
それは私のfooの内容であることが判明しました。 1 + 1
は「オンザフライ」でのみ機能し、ファイルから読み取られないようです。
C:\JDKs\jdk9.0.0.0_x64\bin>type foo.jsh
System.out.println("foo");
C:\JDKs\jdk9.0.0.0_x64\bin>jshell.exe foo.jsh
foo
| Welcome to JShell -- Version 9
| For an introduction type: /help intro
jshell> /exit
| Goodbye
C:\JDKs\jdk9.0.0.0_x64\bin>
JShell
は、Javaクラスを直接実行するためのものではありません。 Javaクラスを実行する場合でも、古い方法で実行する必要があります-Java <your-class-name>
。
docs から、
Javaシェルツール(JShell)は、Javaプログラミング言語を学習してJavaコードをプロトタイピングするためのインタラクティブなツールです。 JShellは、Read-Evaluate-Print Loop(REPL)であり、宣言、ステートメント、および式が入力されるとそれらを評価し、結果をすぐに表示します。
この引用によると、JShellは個々のJavaステートメントを実行または試行するためのものです。従来のJavaの方法では、実行して結果を確認する前に、完全なJavaプログラムを作成する必要があります。ただし、JShellを使用すると、完全なスタンドアロンのJavaアプリケーションを構築しなくても、Javaステートメントを試すことができます。
したがって、あなたの質問に対する簡単な答えは、いいえ、jshell my-jshell-skript.Java
のようなスタンドアロンのJavaアプリケーションを呼び出すことはできないということです。ただし、個々のJShellコマンドまたはJavaステートメントを含むスクリプトファイルを呼び出すことはできます。したがって、JavaプログラムからすべてのステートメントをコピーしてJShellスクリプトに貼り付けると、次のようなスクリプトを実行できます。
% jshell my-jshell-skript.jsh
ただし、これはスタンドアロンのJavaアプリケーションを実行することとはまったく同じではありません。
これらのステートメントを使用してsome.jsh
という名前の Jshellスクリプト ファイルを作成し、コマンドプロンプトでjshell
を実行して、次のように実行できます。
jshell /path/to/some.jsh
MacOSXでは、次のようなことをします。
文字列をJShellにパイプできます。
echo 1 + 2 | jshell
例:
:/# echo 1 + 2 | jshell
| Welcome to JShell -- Version 9
| For an introduction type: /help intro
jshell> 1 + 2
$1 ==> 3
:/#
または、ファイルから:
cat myfile | jshell
ここで、myfile
には「1 + 2」という行が含まれています。
Jshellでは、次のコマンドを発行して、現在のスニペットをファイルに保存できます。
/save Filename
同様に、以下を発行することにより、ファイルを現在のコンテキスト/セッションにロードできます。
/open Filename
これがそのような例の1つです。
| Welcome to JShell -- Version 9.0.7.1
| For an introduction type: /help intro
jshell> String[] names={"nameone","nametwo"}
names ==> String[2] { "nameone", "nametwo" }
jshell> Arrays.toString(names);
$2 ==> "[nameone, nametwo]"
jshell> /save myExample
jshell> % sudipbhandari at sysadm-Latitude-5480 in ~ 18:22
> jshell
| Welcome to JShell -- Version 9.0.7.1
| For an introduction type: /help intro
jshell> names
| Error:
| cannot find symbol
| symbol: variable names
| names
| ^---^
jshell> /open myExample
jshell> names
names ==> String[2] { "nameone", "nametwo" }
jshell
フィードバックモードでconcise
を起動し、必要なコンテンツをフィルタリングします-
$echo '40 + 2' | jshell --feedback concise | sed -n '2p' |sed -En 's/[^>]*>(.+)/\1/gp'
出力:42
Windowsで、jsh
ファイルの詳細な出力を確認する
type file.jsh | jshell -v
実行時の問題jshell file.jsh
D:\>type file.jsh
3 + 5
D:\>jshell file.jsh
| Welcome to JShell -- Version 13.0.2
| For an introduction type: /help intro
jshell>
回避策:
D:\>type file.jsh
3 + 5
D:\>type file.jsh | jshell -v
| Welcome to JShell -- Version 13.0.2
| For an introduction type: /help intro
jshell> $1 ==> 8
| created scratch variable $1 : int
jshell>
注:ファイルには、最後の行の後に空白行(/ n)を含める必要があります。そうしないと、最後の行が実行されません。