命令行参数中*的问题

Nit*_*les 17 glob wildcard command-line-arguments

我用Java编写了一个程序,它通过命令行参数接受输入.我从命令行输入两个数字和一个运算符.为了将两个数相乘,我必须提供输入,例如5 3 *,但它不是按照书面形式工作的.

为什么不接受*命令行?

pol*_*nts 30

那是因为它*是一个shell通配符:它对shell有特殊意义,它在将它传递给命令之前扩展它(在本例中java).

由于您需要文字*,因此需要将其从shell中转义.转发的确切方式因shell而异,但您可以尝试:

java ProgramName 5 3 "*"
Run Code Online (Sandbox Code Playgroud)

要么:

java ProgramName 5 3 \*
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你想知道shell就用什么*,尝试的内容打印String[] args到您的main方法.您会发现它将包含目录中文件的名称.

如果您需要将一些文件名作为命令行参数传递,这可能很方便.

也可以看看

  • 维基百科:glob

    例如,如果一个目录包含两个文件,a.log并b.log随后命令cat *.log将由外壳扩展cat a.log b.log

  • 维基百科:逃脱角色

    在Bourne shell(sh)中,星号(*)和问号(?)字符是通过globbing扩展的通配符.如果没有前面的转义字符,*则会扩展为工作目录中不以句点开头的所有文件的名称,当且仅当存在此类文件时,否则将*保持未展开状态.因此,要引用一个字面上调用的文件"*",必须告诉shell不要以这种方式解释它,前面加上反斜杠(\).


Arn*_*rig 5

在 MS WINDOWS 下并不完全正确:“java.exe”用通配符默默地扩展命令行参数

  • *
  • ?
  • [ABC]

,但仅在最后一个组件中,所以

a/*/*
Run Code Online (Sandbox Code Playgroud)

不按您的预期工作。

它还忽略条目“.”。和“..”,但会尊重以“.”开头的其他文件名。

为了避免误解:如果我使用 PROCEXP 查看正在运行的 JAVA 进程的命令行,我会看到未扩展的参数!

我找不到解决这个问题的方法。换句话说:只要当前目录中至少有一个文件或目录,“java Calc 3 * 7”就不起作用!

这是非常丑陋的,并且似乎一直存在于 Java 8 之前的所有 JRE 版本中。

有人知道如何禁用 Java 令人讨厌的命令行扩展吗?

  • 无论转义/引用如何,此问题也会出现来自 PowerShell 的调用 (2认同)