9

我有一个 java 类,我在其中调用一个 runshellscript 方法来执行脚本。它适用于 mysql,但我似乎无法找出为什么它不适用于 psql。这是我的 runshell 方法的摘录:

public class RunShellScript {

public static void runShellScript (String unixCommand) 
{
 try {
     Runtime runtime=Runtime.getRuntime();
     //Process process=runtime.exec(new String [] { "/bin/csh", "-c", unixCommand});
     Process process=runtime.exec(new String [] {unixCommand});
     InputStream stderr=process.getErrorStream();
     InputStreamReader isr=new InputStreamReader (stderr);
     BufferedReader br=new BufferedReader (isr);
     String line=null;
     System.out.println("<ERROR>");

     while((line=br.readLine())!=null)
         System.out.println(line);

     System.out.println(line);
     int exitVal=process.waitFor();
     System.out.println("Process exitValue:" + exitVal);
 }
 catch (Throwable t)
 {
     t.printStackTrace();
 }

问题是当我把它放在鼠标点击事件后面时,它说找不到命令。这是mous事件的代码

private void jMenuItem13MousePressed(java.awt.event.MouseEvent evt)    {                                         

    String shellCommand="vobs/tools/Scripts/DataValidation/mysqlconnection.csh";
    RunShellScript.runShellScript(shellCommand);
    // TODO add your handling code here:
}                     

奇怪的是,当我直接进入脚本所在的目录并键入 ./mysqlconnection 时,脚本可以工作。但是当我只输入 mysqlconnection 时说找不到命令。不知何故,它没有将我的脚本名称识别为命令?

4

2 回答 2

4

看起来它类似于我面临的问题,当从 autosys [autosys -> shell -> Java -> ProcessBuilder] 调用 shell 脚本(包含系统和用户创建的命令)时,将从
ProcessBuilder命令中执行并在 Linux 机器中执行。
这在我登录 Linux 机器并执行脚本时有效,但是当我从 autosys 调用时它不起作用。
实际问题是$PATH可变的,它不是用用户创建的命令的目录设置的。
我在 shell 脚本中从 Linux 机器和 Autosys 执行时回显 $PATH 变量,从 Autosys 执行时 $PATH 变量未正确设置,在将用户命令路径附加到它起作用的 $PATH 变量之后。
which (cmd)将返回命令的目录,将此目录附加到 $PATH 然后它将起作用。

尝试将您的脚本路径添加到 $PATH 并从您的应用程序执行

于 2015-03-24T12:53:00.783 回答
0

在类 unix 系统上,如果给定一个明确的路径,shell 只会执行驻留在当前目录中的程序。这是为了防止攻击者将一个名为的程序ls放在您的主目录中,该程序将执行而不是ls驻留在/bin/ls. 因此,当前目录被排除在 PATH 之外。

另外,尝试移动

int exitVal=process.waitFor();

while循环上方。

于 2012-08-03T00:03:07.673 回答