我正在寻找一种最有效的方式来决定:
>我应该预先提供用户提供的命令行与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);
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
当我测试我的代码时,这些条件中的一个或另一个没有达到.