Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Unix上的javaexec_Java_Unix_Exec_Runtime.exec - Fatal编程技术网

Unix上的javaexec

Unix上的javaexec,java,unix,exec,runtime.exec,Java,Unix,Exec,Runtime.exec,我在Unix(AIX和Linux)上运行了下面的Java代码,但它不起作用。如果我运行此代码,文件q1.01将不会被压缩,并且不会引发任何异常(文件q1.01存在,我希望在命令运行后找到文件q1.01.Z。)如果我键入“whichcompress”,它将以“/usr/bin/compress”返回报告。如果我在Unix提示符下键入命令“/usr/bin/compress q1.01”,它可以正常工作。有什么想法可能是错误的吗 String cmd = "/usr/bin/compress q1.

我在Unix(AIX和Linux)上运行了下面的Java代码,但它不起作用。如果我运行此代码,文件q1.01将不会被压缩,并且不会引发任何异常(文件q1.01存在,我希望在命令运行后找到文件q1.01.Z。)如果我键入“whichcompress”,它将以“/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()方法有多种形式。您使用的是版本,它只接受可执行文件。相反,您需要使用数组版本,它接受字符串[0]中的可执行文件和字符串[1]中的参数

.exec()需要用于传递参数的字符串数组

试一试


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

如果流程输入流为空,我怀疑Java甚至无法生成子流程。流程#exitValue()返回什么


我建议使用
strace
查看系统调用级别上实际发生的情况参数和返回代码会特别有趣。

有几个问题。一个是我尝试使用通配符,由于没有调用shell,所以它们没有被扩展。另一个问题是我创建了这样的非常小的测试文件:“echo'abc'>q1.01”.这个文件太小了,compress无法进一步压缩它,所以就把它放在一边。(愚蠢的是,我想当我在shell中键入命令时,我使用了另一个文件名,它确实进行了压缩。)


谢谢大家的回答。这确实有帮助!

当您通过shell而不是Java运行命令时,文件会压缩吗?Java可能正在程序目录中查找q1.01,您是否尝试提供文件的完整路径?另外,请查看您是否可以在系统的其他地方找到压缩文件。也许您可以尝试阅读exec()返回的进程对象中的stdout/stderr流。这可能会给你一个它不起作用的线索。为了简化我的帖子,我省略了一些代码细节。我实际上使用Process对象的InputStream来查看返回值,结果返回空值。我还尝试将完整路径放在文件名上,但没有成功。是的,如果我在更奇怪的是,我在Linux和AIX上都尝试过这个程序,并且在这两台机器上都做过同样的事情。我不会这样解释Runtime#exec(String)方法文档:指示参数被使用StringTokenizer类分解成令牌。Verified.Runtime#exec(String)确实拆分了它的参数。请尝试Runtime.getRuntime().exec(“nslookup www.stackoverflow.com”)。啊!我尝试过这种形式的exec方法,但我使用了“*.01”作为参数,由于它没有通过shell,所以没有展开。谢谢!嘿-我是1/2对的。我得到50%的分数吗?:)还有一种方法可以诊断类似的问题。创建一个shell脚本,只将其参数写入文件,然后运行它。然后查看编写了什么。它修复了一个问题,但代码仍然没有不起作用。至少现在我有几个其他想法可以尝试。进程输入流不是空的,返回空的是流中的读取行。显然,当它运行时没有输出。许多Unix程序成功时根本没有输出。
String[] cmd = new String[] { "/usr/bin/compress", "q1.01" };
Runtime.getRuntime().exec(cmd);