【发布时间】:2018-08-03 14:48:35
【问题描述】:
考虑以下简单的 Java 程序:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
System.out.println(Arrays.asList(args));
}
}
全局扩展通常由 shell 完成,而不是 JVM。示例,在 Cygwin 中:
$ echo *
Main.class
这里 Cygwin 将 * 扩展为 Main.class(目录中的文件)
可以关闭此行为:
$ set -f
$ echo *
*
现在* 还没有展开。
但是,当将 * 传递给 Java 程序时,通配符会以某种方式被扩展:
$ set -f
$ java Main *
[Main.class]
引用或转义也无济于事:
$ java Main '*'
[Main.class]
$ java Main \*
[Main.class]
谁是罪魁祸首,Shell 还是 Java?似乎是 JVM,因为 python 程序可以正常工作:
Python 文件a.py:
import sys
print sys.argv[1:]
使用通配符运行 python 程序:
$ set -f; python a.py *
['*']
没有扩展。
JVM为什么要扩展通配符?那应该是Shell的功能,而不是JVM。如何关闭它?
【问题讨论】:
-
不清楚你在问什么:你真正想要哪些行为?或者,如果不在上面,你想让它做什么?
-
这里有什么问题?或者你只是在一些关于它的文件之后?
*.java.net上关于它的文章很少 -
@Andy 更改了标题以更好地反映意图。 JVM 应该保持原样。事实上,这里有很多关于 SO 的问题,询问如何让 JVM 扩展 glob。答案是不能。这是 shell 的一个特性,而不是 JVM。
-
Wouldn't escape work??如:java Main *
-
@oldercoder 转义?你是说
java Main \*?不,它没有