Unix 上的 Java 执行

标签 java unix exec runtime.exec

我在 Unix(AIX 和 Linux)上运行了下面的 Java 代码,但它不起作用。如果我运行此代码,文件 q1.01 不会被压缩,并且我不会抛出任何异常(文件 q1.01 存在,我希望在命令运行后找到文件 q1.01.Z。)如果我输入“which compress”,命令提示符会报告“/usr/bin/compress”。如果我在 Unix 提示符下输入命令“/usr/bin/compress q1.01”,它就可以正常工作。关于可能出现问题的任何想法吗?

String cmd = "/usr/bin/compress q1.01";
Runtime.getRuntime().exec(cmd);

最佳答案

[后来编辑:问题出在最初的描述中; OP 传递的是通配符而不是 q.01。所以我下面的答案是错误的,除了粗体部分。我将其保留,以便后面的评论有意义。]

它尝试将 /usr/bin/compress 作为不带参数的程序名称运行。

Runtime.exec() 方法有多种形式。您正在使用.exec(String)版本,只接受可执行文件。相反,您需要使用 .exec(String[])数组版本,它采用 String[0] 中的可执行文件和 String[1..] 中的参数。

.exec() 需要一个字符串数组来传递参数。

尝试

String[] cmd = new String[] { "/usr/bin/compress", "q1.01" };
Runtime.getRuntime().exec(cmd);

请注意,.exec 不会调用本地命令 shell。这意味着我们必须在调用 .exec() 之前进行通配符扩展,甚至进行一些参数解析。这就是为什么您不能只将完整的命令行传递给它。

关于Unix 上的 Java 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1049081/

相关文章:

c++ - Python 在加载 C++ 编写的扩展模块时收到 SIGSEGV

shell - 对数字范围使用 sed 命令

sql - 在 SQL Server 中检查临时表中是否存在列总是返回 false

multithreading - 调用 exec() 时线程会发生什么?

java - 将 CalendarEvent 插入到 "primary"以外的其他日历

java - Java 中的套接字流

java - 带有日期和时间的 JFormattedTextField

java - 2类和外部库的JAVA编译问题

linux - Unix 命令理解 sed 脚本

php - 硬盘温度不会通过网络显示