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方法.您会发现它将包含目录中文件的名称.
如果您需要将一些文件名作为命令行参数传递,这可能很方便.
例如,如果一个目录包含两个文件,
a.log并b.log随后命令cat *.log将由外壳扩展cat a.log b.log
在Bourne shell(
sh)中,星号(*)和问号(?)字符是通过globbing扩展的通配符.如果没有前面的转义字符,*则会扩展为工作目录中不以句点开头的所有文件的名称,当且仅当存在此类文件时,否则将*保持未展开状态.因此,要引用一个字面上调用的文件"*",必须告诉shell不要以这种方式解释它,前面加上反斜杠(\).
在 MS WINDOWS 下并不完全正确:“java.exe”用通配符默默地扩展命令行参数
,但仅在最后一个组件中,所以
a/*/*
Run Code Online (Sandbox Code Playgroud)
不按您的预期工作。
它还忽略条目“.”。和“..”,但会尊重以“.”开头的其他文件名。
为了避免误解:如果我使用 PROCEXP 查看正在运行的 JAVA 进程的命令行,我会看到未扩展的参数!
我找不到解决这个问题的方法。换句话说:只要当前目录中至少有一个文件或目录,“java Calc 3 * 7”就不起作用!
这是非常丑陋的,并且似乎一直存在于 Java 8 之前的所有 JRE 版本中。
有人知道如何禁用 Java 令人讨厌的命令行扩展吗?