Perl脚本在终端运行,但是从Java程序调用时不运行(Perl script runs in te

2019-07-17 13:37发布

我运行一个Perl脚本,替换字符串与另一:

perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt

当我从终端运行此命令时,它也将替换所有出现str1指定的文件在str2 。 当我运行这个从Java它访问该文件,但没有发生更换:

Runtime.getRuntime().exec("perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt");
  • 我敢肯定,它访问文件(该文件似乎在gedit中进行编辑(重装所需的))。
  • 我试过的Java ProcessBuilder类,但相同的结果发生。
  • 当我使用Runtime.exec()ProcessBuilder与其它命令(如gedit newFile.txt ),他们工作得很好。
  • 讽刺的是,我从Java印刷上述perl的命令,并采取糊在终端和更换操作完成!
  • 通过使用这些命令没有异常或错误。 (我用try和catch以确保这一点)。
  • 我也用/usr/bin/perl ,而不是perl在cmd以确保perl的CMD执行。

那么你认为是什么问题?

编辑:

我刚好从命令在java中删除引号解决了这个问题。 由于@ikegami的帮助。 因此,工作版本是:

perl -pi.back -e s/str1/str2/g; path/to/file1.txt

代替

perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt

Answer 1:

exec使用StringTokenizer解析命令,这显然只是按空白进行分割。

采取例如下列外壳命令(类似但比你的不同):

perl -pi.back -e 's/a/b/g; s/c/d/g;' path/to/file1.txt

对于它, StringTokenizer产生下面的命令和参数:

  • perl (命令)
  • -pi.back
  • -e
  • 's/a/b/g;
  • s/c/d/g;'
  • path/to/file1.txt

这是完全错误的。 命令和参数应该是

  • perl (命令)
  • -pi.back
  • -e
  • s/a/b/g; s/c/d/g; (注缺乏引号)。
  • path/to/file1.txt

你可以通过上面来exec(String[] cmdarray) 或者,如果你没有在解析命令的选项,你实际上可以调用一个shell在通过下面来分析它为你exec(String[] cmdarray)

  • sh (命令)
  • -c
  • perl -pi.back -e 's/a/b/g; s/c/d/g;' path/to/file1.txt


文章来源: Perl script runs in terminal but doesn't run when invoked from Java program