为什么 java 参数在 Windows 和 Linux 中表现不同?

Why java arguments behave differently in Windows and Linux?

我在 Windows cmd 和 wsl (ubuntu) 上测试一个简单的 java class 得到了不同的结果。

java class:

public class PrintArgs {

    public static void main(String[] args) {

        System.out.println("Printing some arguments in this code: ");

        // Loop through arguments passed and print them to standard output
        for (int i = 0; i < args.length; i++) {
            System.out.println("Argument " + (i + 1) + ": " + args[i]);
        }
    }
}

我使用这个测试参数:

java PrintArgs.java Test "Testing TestThis" 'Some arguments' ´More Arguments´

在 cmd 中,单引号不对参数进行分组: cmd results and java version

但在 ubuntu 中,它确实: wsl results and java version

知道为什么会这样吗?

Java 进程已经得到一个字符串数组作为参数(在任何基于 C 的程序中,它更像是一个 **char,但已经足够接近了)。它甚至 看不到 将单个参数组合在一起的引号,因为那些已经被 shell.

解释过

shell(可能是WSL中的Bash和window命令中的cmd.exe)负责获取用户输入的单个连续字符串并拆分它变成参数(并在适用的情况下扩展通配符,但在这种情况下不会发生)。

现在 Bash 和 cmd.exe 关于引号的工作方式有不同的规则,所以他们以不同的方式拆分单个字符串。