【问题标题】:Execute a shell script (shell script which uses perl and other shell scripts) in Linux from java从 java 在 Linux 中执行一个 shell 脚本(使用 perl 和其他 shell 脚本的 shell 脚本)
【发布时间】:2015-07-22 01:05:44
【问题描述】:

我正在尝试从 java 程序执行一个 shell 脚本(使用 perl 脚本和其他 shell 脚本),但是我没有成功,这是我尝试过的:

在 Linux 服务器上,文件夹 test1/testJava 中有以下脚本可用:

  1. decode24.sh(我从java程序调用的主脚本,这个脚本利用了下面列出的其他脚本)
  2. fram.sh
  3. shadow.pl
  4. light.sh

这是我从 java 中尝试的:

try {
        ConnBean cb = new ConnBean("xx.yyy.zz.p", "user","passme");
        ssh = SSHExec.getInstance(cb);
        CustomTask ct1 = new ExecShellScript("/test1/testJava", "./decode24.sh", "arg1");
        ssh.connect();
        net.neoremind.sshxcute.core.Result res = ssh.exec(ct1);
 }catch......

执行后的结果:

错误信息:

./decode.sh[17]: shadow.pl: not found [No such file or directory]
./decode.sh[21]: fram.sh: not found [No such file or directory]

【问题讨论】:

  • 你得到的错误来自那个shell脚本。你确定你在正确的工作目录中运行它并且你确保所有的文件都是可执行的吗?
  • 你的 decode.sh 是什么样的?可能您在尝试运行的脚本前面没有./,它在任何地方都找不到它们

标签: java linux bash perl shell


【解决方案1】:

错误来自您的decode.sh 脚本。它找不到它执行的shadow.plfram.sh 脚本。可能是因为运行脚本时没有将 CWD 或路径设置为脚本目录。

解决此问题的最可靠方法是将您的 decode.sh 脚本更改为使用 shadow.plfram.sh 脚​​本的绝对路径。这样你就可以从任何目录执行decode.sh

如果您使用 bash,请查看this 问题,了解将绝对目录解析为脚本以避免硬编码路径的巧妙方法。

【讨论】:

  • 感谢您的快速回复。但是,如果出于某种原因我无法将路径更改为 decode.sh 上的绝对路径,是否有办法从 java 运行 decode.sh 脚本?
  • 我对您用来执行命令的第三方库知之甚少。可能您可以为环境提供更好的 PATH,或使其正确设置 CWD。但是,最好的方法是让 shell 脚本更好,并且您在使用它们时会避免将来出现类似的问题。
【解决方案2】:

让 decode.sh 找出它所在的目录(参见bash solution)并使用该路径调用其他目录。

【讨论】: