コマンドライン引数を介して入力を受け入れるプログラムを Java で作成しました。コマンド ラインから 2 つの数字と演算子を入力します。2 つの数を掛けるには、例として入力する必要があります5 3 *
が、書かれているとおりに機能しません。
*
コマンドラインから受け付けないのはなぜですか?
コマンドライン引数を介して入力を受け入れるプログラムを Java で作成しました。コマンド ラインから 2 つの数字と演算子を入力します。2 つの数を掛けるには、例として入力する必要があります5 3 *
が、書かれているとおりに機能しません。
*
コマンドラインから受け付けないのはなぜですか?
これ*
は、 がシェルのワイルドカードであるためです。これはシェルにとって特別な意味を持ち、コマンド (この場合はjava
) に渡す前に展開します。
リテラルが必要なので*
、シェルからエスケープする必要があります。エスケープの正確な方法はシェルによって異なりますが、次の方法を試すことができます。
java ProgramName 5 3 "*"
または:
java ProgramName 5 3 \*
ところで、シェルが で何をするか知りたい場合は*
、 の内容をメソッドに出力してみString[] args
てくださいmain
。ディレクトリ内のファイルの名前が含まれていることがわかります。
これは、いくつかのファイル名をコマンド ライン引数として渡す必要がある場合に便利です。
たとえば、ディレクトリに 2 つのファイルが含まれている場合
a.log
、b.log
コマンドcat *.log
はシェルによって次のように展開されます。cat a.log b.log
Bourne シェル (
sh
) では、アスタリスク (*
) および疑問符 (?
) 文字は、グロビングによって展開されるワイルドカード文字です。先行するエスケープ文字*
がない場合、ピリオドで始まらない作業ディレクトリ内のすべてのファイルの名前にそのようなファイルが存在する場合にのみ展開され、それ以外の場合は展開されません*
。そのため、文字どおり と呼ばれるファイルを参照するには、そのファイル"*"
の前にバックスラッシュ ( ) を付けて、このように解釈しないようにシェルに指示する必要があります\
。
MS WINDOWS では正しくありません: "java.exe" はワイルドカードを使用してコマンド ライン引数を黙って展開します
、しかし最後のコンポーネントだけなので、
a/*/*
期待どおりに動作しません。
また、エントリ "." も無視されます。および ".." ですが、"." で始まる他のファイル名は受け入れられます。
誤解を避けるために: PROCEXP で実行中の JAVA プロセスのコマンド ラインを見ると、展開されていない引数が表示されます。
これを回避する方法が見つかりませんでした。つまり、現在のディレクトリに少なくとも 1 つのファイルまたはディレクトリがある限り、"java Calc 3 * 7" は機能しません。
これは非常に醜く、Java 8 までのすべての JRE バージョンに常に存在していたようです。
Java の厄介なコマンドライン展開を無効にする方法を知っている人はいますか?
* は、シェル インタープリターで特別な意味を持ちます。* を取得する方法は、使用しているシェル インタープリターによって異なります。Bash の場合、"*" のような二重引用符ではなく、単一引用符 ('*') で囲む必要があります。
*
のように引用符で囲んでみてください"*"
。星印は、コマンド ラインで予約されている記号です。