gpt4 book ai didi

java - 在 Java 命令行中传递星号

转载 作者:行者123 更新时间:2023-12-01 20:20:28 28 4
gpt4 key购买 nike

根据一些教科书和资源,使用星号作为命令行参数是一个错误,因为输入它时,会列出该目录中的所有文件。原因是星号用于通配符导入。

但是,我没有遇到这个问题,并且我使用了这段代码。

public class Main{
public static void main( String[] args ){
System.out.println(args[0]);
}
}

命令行:javac Main.java(用于编译)

命令行:java Main“*”(用于运行)

遇到这个问题与我使用的操作系统无关吗?

输出:*

最佳答案

这并不是一个真正的 Java 问题,而是一个 shell 问题。

在大多数 UNIX 和 Linux shell 中,您可以使用 echo 之类的东西来演示会发生什么。

$ mkdir tmp
$ cd tmp
$ echo *
*
$ touch foo bar
$ echo *
foo bar
$ echo "*"
*

所以,

  • 如果目录中没有文件,* 最终为 *
  • 如果目录中有文件,* 将扩展为其文件名。
  • 如果将 * 加上引号 - "*" - 则不会发生扩展

您需要了解的是扩展发生的时间。在典型的 Linux/UNIX shell(bash、ksh、csh 等)中,various kinds of expansion are done before any command is invoked ,其中包括文件名扩展。

因此,当 echo 打印 foo bar 时,它甚至没有看到 *。当 bash 使用系统调用调用命令时,它已经扩展到字符串数组 char *args[] = {"foo", "bar"} execve("/bin/echo", args)

并非所有计算机系统都这样工作。例如,在 MS-DOS 中,命令 shell 根本不进行文件名扩展。因此,当 DIR * 显示文件名列表时,是 DIR.exe 扩展了 *,而不是 CMD.exe.

<小时/>

这一切意味着,如果您编写自己的程序来将 * 理解为命令行参数,则会给用户带来潜在的困惑。如果他们忘记在 * 两边加上引号,那么当当前目录为空时,它将以一种方式运行,而当有文件时,它将以另一种方式运行。

关于java - 在 Java 命令行中传递星号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44849289/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com