命令行参数中的 * 问题

我用Java编写了一个程序,它通过命令行参数接受输入。我从命令行获得两个数字和一个运算符的输入。要将两个数字相乘,我必须输入例如,但它不像写的那样工作。5 3 *

为什么它不接受命令行?*


答案 1

这是因为 是 shell 通配符:它对 shell 具有特殊含义,在将其传递给命令之前对其进行扩展(在本例中为 )。*java

由于你需要一个字面,你需要从 shell 中转义它。逃逸的确切方式因外壳而异,但您可以尝试:*

java ProgramName 5 3 "*"

艺术

java ProgramName 5 3 \*

顺便说一句,如果您想知道 shell 对 做什么,请尝试将 的内容打印到您的方法中。您会发现它将包含目录中文件的名称。*String[] argsmain

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

另请参见

  • 维基百科: glob

    例如,如果一个目录包含两个文件,则该命令将被 shell 扩展为a.logb.logcat *.logcat a.log b.log

  • 维基百科: 逃生字符

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


答案 2

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

  • *
  • ?
  • [美国广播公司]

,但仅在最后一个组件中,因此

a/*/*

无法按预期工作。

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

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

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

这是非常丑陋的,似乎在所有JRE版本中都一直存在,直到Java 8。

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