命令行参数中的 * 问题
我用Java编写了一个程序,它通过命令行参数接受输入。我从命令行获得两个数字和一个运算符的输入。要将两个数字相乘,我必须输入例如,但它不像写的那样工作。5 3 *
为什么它不接受命令行?*
我用Java编写了一个程序,它通过命令行参数接受输入。我从命令行获得两个数字和一个运算符的输入。要将两个数字相乘,我必须输入例如,但它不像写的那样工作。5 3 *
为什么它不接受命令行?*
这是因为 是 shell 通配符:它对 shell 具有特殊含义,在将其传递给命令之前对其进行扩展(在本例中为 )。*
java
由于你需要一个字面,你需要从 shell 中转义它。逃逸的确切方式因外壳而异,但您可以尝试:*
java ProgramName 5 3 "*"
艺术
java ProgramName 5 3 \*
顺便说一句,如果您想知道 shell 对 做什么,请尝试将 的内容打印到您的方法中。您会发现它将包含目录中文件的名称。*
String[] args
main
如果您需要将某些文件名作为命令行参数传递,这可能很方便。
例如,如果一个目录包含两个文件,则该命令将被 shell 扩展为
a.log
b.log
cat *.log
cat a.log b.log
在 Bourne shell () 中,星号 () 和问号 () 字符是通过通配符扩展的通配符。如果没有前面的转义字符,an 将扩展到工作目录中所有不以句点开头的文件的名称,当且仅当存在此类文件时,否则将保持未展开状态。因此,要引用一个字面意思是的文件,必须告诉shell不要以这种方式解释它,方法是在它前面加上反斜杠()。
sh
*
?
*
*
"*"
\
在MS WINDOWS下不太正确:“java.exe”使用通配符静默地扩展命令行参数
,但仅在最后一个组件中,因此
a/*/*
无法按预期工作。
它还会忽略条目“.”和“..”,但会支持以“.”开头的其他文件名。
为了避免误解:如果我用PROCEXP查看正在运行的JAVA进程的命令行,我会看到未展开的args!
我发现没有办法解决这个问题。换句话说:只要当前目录中至少有一个文件或目录,“java Calc 3 * 7”就不起作用!
这是非常丑陋的,似乎在所有JRE版本中都一直存在,直到Java 8。
有没有人知道如何禁用Java令人讨厌的命令行扩展?