Java,Runtime.exec或ProcessBuilder:如何知道文件是shell还是二进制文件?

前端之家收集整理的这篇文章主要介绍了Java,Runtime.exec或ProcessBuilder:如何知道文件是shell还是二进制文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找一种最有效的方式来决定:

>我应该预先提供用户提供的命令行与shell可执行文件
>如果是,那可执行文件是什么? (/ bin / sh?/usr/bin/perl?/usr/bin/ksh?c:/../ cmd.exe?)

众所周知,要从Java启动shell脚本,应该启动shell:

ProcessBuilder pb = new ProcessBuilder("/bin/sh","script.sh","arg1","arg2);

要启动一个二进制文件,应该启动二进制本身:

ProcessBuilder pb = new ProcessBuilder("/path/binary","arg2);

如果使用shell执行二进制文件,则会产生错误

ProcessBuilder pb = new ProcessBuilder("/bin/sh","/path/binary","arg2);
(sh: cannot execute binary file)

如果shell脚本在没有shell二进制的情况下执行,则会产生错误

ProcessBuilder pb = new ProcessBuilder("script.sh","arg2);
(error 2: file not found)

我处于一种情况,我的应用程序不知道它的开始,二进制或脚本.

已启动的应用程序是由最终用户提供的事件处理程序.它最有可能是在Unix下执行的shell脚本;但它可以是Windows下的* .cmd,或者在某些晦涩的平台下执行的Perl脚本.毕竟是Java.

我的第一个天真的尝试是用shell启动命令行,看看它是否有效.如果没有,请尝试以二进制形式执行.

这是丑陋和危险的:在平台和shell的一些未知的组合下,第二次运行可能仍然执行脚本,第二次,具有不可预测的结果.

另外,当我无法启动它时,我无法确定脚本何时启动,并且由于自身的某些问题而失败.

我现在考虑的最好的事情是:

>阅读脚本并查找任何不可打印的字节
>如果找到,认为它是一个二进制
>如果没有,添加/ bin / sh(或cmd.exe如果在Windows下)

请告知您是否有更好的想法.

更新/部分解决方

感谢所有与我分享他们想法的人.

原来,我已经困惑了自己和互联网的其余部分:)

用户输入的命令行之前,不需要在前面加上二进制文件

>脚本在PATH中
>(对于Unix)脚本是可执行的
>(对于Unix),脚本具有#!/ path / to / interpreter

当我测试我的代码时,这些条件中的一个或另一个没有达到.

猜你在找的Java相关文章