OS X命令行应用程序在从Java调用时找不到目录

时间:2015-04-29 13:50:01

标签: java macos command-line

如果我在终端中运行它可以正常工作:

lsof -F n +D /some/directory

但是当我从Java运行相同的东西时它不会:

                    Process lsof = new ProcessBuilder("lsof", "-F", "n", "+D", "'/some/directory'").start();
                    lsof.waitFor();

                    if (lsof.exitValue() != 0) {
                        BufferedReader reader = null;
                        try {
                            reader = new BufferedReader(new InputStreamReader(lsof.getErrorStream()));
                            String line = null;
                            StringBuffer sb = new StringBuffer();
                            while ((line = reader.readLine()) != null) {
                                sb.append(line);
                                sb.append("\n");
                            }

                            log.warning("STDOUT:\n" + sb.toString());
                        } finally {
                            if (reader != null) {
                                reader.close();
                            }
                        }
                    }

从Java调用时,它返回:

STDOUT:
  lsof: WARNING: can't stat('/some/directory'): No such file or directory
lsof 4.85
 latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
 latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
 latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
 usage: [-?abhlnNoOPRtUvV] [+|-c c] [+|-d s] [+D D] [+|-f[cgG]]
 [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Use the ``-h'' option to get more help information.

任何人都可以解释原因吗?

2 个答案:

答案 0 :(得分:0)

我还没有发表评论,所以我很抱歉回答而不是发表评论。也许这不是问题,但Mac OS通常会自动切换引号和其他标记。这可能会导致某些命令的执行失败。我不认为IDE会使用这种设置,但是如果你在TextEditor中写作 - 我不认为你是btw - 这将会发生。

即使这不是你的问题,如果你没有改变这个问题,我建议你应该这样做以避免将来出现这个问题。

要改变这个: 偏好>键盘

希望这有助于某人。

答案 1 :(得分:0)

new ProcessBuilder("lsof", "-F", "n", "+D", "'/some/directory'")
                                             ^               ^

删除/some/directory周围的单引号。它们被传递到lsof程序并被解释为路径名的一部分。