Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java运行带有通配符的unix/shell命令?_Java - Fatal编程技术网

如何使用Java运行带有通配符的unix/shell命令?

如何使用Java运行带有通配符的unix/shell命令?,java,Java,我想在Java中运行一些unix/shell命令并处理输出。我使用了getRuntime.exec(),但它没有为一些命令提供正确的输出,如ls directory\u path/*.tar.gz。对于该命令,我的程序没有给出任何输出,但它给出了一个错误,即没有这样的文件或目录。但同一命令在命令提示符下给出了正确的输出 有没有其他方法可以执行Java中包含通配符的命令?这是因为您指定了目录的相对路径,并且您的应用程序正在工作目录中运行。指定的路径是相对于该工作目录的 System.out.pri

我想在
Java
中运行一些
unix/shell
命令并处理输出。我使用了
getRuntime.exec()
,但它没有为一些命令提供正确的输出,如
ls directory\u path/*.tar.gz
。对于该命令,我的程序没有给出任何输出,但它给出了一个错误,即
没有这样的文件或目录
。但同一命令在命令提示符下给出了正确的输出


有没有其他方法可以执行Java中包含通配符的命令?

这是因为您指定了目录的相对路径,并且您的应用程序正在工作目录中运行。指定的路径是相对于该工作目录的

System.out.println("Working directory: " + System.getProperty("user.dir"));
要了解绝对路径是什么,可以查看工作目录

System.out.println("Working directory: " + System.getProperty("user.dir"));
“ls directory_path/*.tar.gz”相对于当前目录工作

System.out.println("Working directory: " + System.getProperty("user.dir"));
有没有其他方法来执行Java中包含通配符的命令?

您的代码中有三个潜在问题:

  • 假设要查看外部命令的输出,则需要处理它生成的输出,并自己打印

    遵循我在这里提供的示例:



  • 如果您天真地执行
    Runtime.exec
    ,则
    *
    的shell扩展无法工作。您必须明确地执行
    /bin/bash

  • 如果您试图列出
    目录路径/*.tar.gz
    的内容,您应该知道(如果您不是以
    /
    开头)
    目录路径
    将相对于当前工作目录进行解析。首先尝试给出绝对路径以确保其有效,然后尝试找出它找不到相对路径的原因

  • 下面是一个完整的示例:

    Process proc = new ProcessBuilder("/bin/bash", "-c",
                                      "ls /.../directory_path/*.tar.gz").start();
    
    Reader reader = new InputStreamReader(proc.getInputStream());
    int ch;
    while ((ch = reader.read()) != -1)
        System.out.print((char) ch);
    reader.close();
    

    您应该知道,这意味着您的硬盘根目录中有一个名为“actual”的文件夹,假设您使用的是基于Unix的操作系统。是的。这是唯一存在的路径。同一命令正在命令提示符下运行。请仔细检查您的路径,以及当前所在的目录。”“没有这样的文件或目录”表示它正在正确执行命令,但路径与您想象的不同。是否只列出文件?您可以使用java代码来实现这一点,而不必运行依赖于系统的“本机”工具。谢谢,我用它获得了正确的输出。那么,它也适用于其他命令吗?是的,它适用于所有类型的命令。(除非您确实需要对通配符的支持,否则不要使用
    /bin/bash
    )。确保您对所有有用的答案都投了赞成票,并且如果这些答案解决了您的问题。是否有一种非操作系统特定的方式使用Java中的通配符<代码>bash在Windows上可能不存在。@AlikElzin kilaka,你是什么意思?无论您运行的是什么外部程序,它都是特定于操作系统的。如果外部程序是
    ls
    dir
    ,我建议您循环使用Java中的文件,并使用regexps筛选出感兴趣的文件。