Java 从外部目录运行Shell脚本:没有这样的文件或目录
我有一个shell脚本文件,我想从java运行。我的java工作空间目录与脚本的目录不同Java 从外部目录运行Shell脚本:没有这样的文件或目录,java,bash,shell,Java,Bash,Shell,我有一个shell脚本文件,我想从java运行。我的java工作空间目录与脚本的目录不同 private final String scriptPath = "/home/kemallin/Desktop/"; public void cleanCSVScript() { String script = "clean.sh"; try { Process awk = new ProcessBuilder(scriptPath + script).start()
private final String scriptPath = "/home/kemallin/Desktop/";
public void cleanCSVScript() {
String script = "clean.sh";
try {
Process awk = new ProcessBuilder(scriptPath + script).start();
awk.waitFor();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我得到了这个错误:
java.io.IOException: Cannot run program "cat /home/kemallin/Desktop/capture-03.csv | awk -F ',' '{ print $1,",", $2,",", $3,",", $4,",", $6}' > clean.csv": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
at ShellScript.cleanCSVScript(ShellScript.java:21)
at Main.main(Main.java:15)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:186)
at java.lang.ProcessImpl.start(ProcessImpl.java:130)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
... 2 more
java.io.FileNotFoundException: /home/kemallin/Desktop/clean.csv (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at java.io.FileInputStream.<init>(FileInputStream.java:101)
at java.io.FileReader.<init>(FileReader.java:58)
at CSVReader.run(CSVReader.java:25)
at Main.main(Main.java:17)
java.io.IOException:无法运行程序“cat/home/kemallin/Desktop/capture-03.csv | awk-F”,“打印$1”,“打印$2”,“打印$3”,“打印$4”,“打印$6}'>clean.csv”:错误=2,没有这样的文件或目录
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
位于ShellScript.cleanCSVScript(ShellScript.java:21)
Main.Main(Main.java:15)
原因:java.io.IOException:error=2,没有这样的文件或目录
位于java.lang.UNIXProcess.forkAndExec(本机方法)
位于java.lang.UNIXProcess(UNIXProcess.java:186)
在java.lang.ProcessImpl.start(ProcessImpl.java:130)
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
... 还有两个
java.io.FileNotFoundException:/home/kemallin/Desktop/clean.csv(无此类文件或目录)
在java.io.FileInputStream.open(本机方法)
位于java.io.FileInputStream。(FileInputStream.java:146)
位于java.io.FileInputStream。(FileInputStream.java:101)
位于java.io.FileReader。(FileReader.java:58)
运行(CSVReader.java:25)
Main.Main(Main.java:17)
我已经在谷歌上搜索过了,每一个解决方案都表明我在做正确的事情
我曾尝试将脚本文件放在Java项目的src和bin中,但它仍然表示没有这样的文件或dir
我做错了什么
谢谢。您的程序
clean.sh
不是Java所理解的可执行文件,即使底层系统将其理解为可执行文件
您需要告诉Java执行命令需要什么shell。Do(假设您使用的是bash
,并且安装在/bin/bash
):
您应该执行
chmod 755/home/kemallin/Desktop/clean.sh
,并确保java进程在相同的用户ID下运行,java试图将整个命令行作为单个命令运行。字符串cat/home/…
不是一个程序,cat
是,其余的是cat的一个参数。Marc B可能是对的,而且我不是java爱好者,所以我可能要做的是检查/home/kemallin/Desktop/capture-03.csv
和/home/kemallin/Desktop/clean.sh
的权限。确保运行java程序的用户有权访问这些文件(如果您只想放弃权限问题,则为a+rwx…如果是,则可以从那里开始工作)。我认为您的错误输出与显示的java代码不匹配。在Java代码中,要运行的命令应该是“/home/kemallin/Desktop/clean.sh”,但在显示的错误输出中会出现“cat/home/kemallin/Desktop/capture-03.csv”和“/home/kemallin/Desktop/clean.csv”:(@MarcB那么你有什么建议?我应该分解shell脚本?@jim clean.sh有755,运行java程序的用户拥有clean.sh,所以访问应该不是问题,对吗?它仍然说“没有这样的文件或目录”。这解决了部分问题。谢谢。我相应地更新了问题。我的错误完全解决了问题。
private final String scriptPath = "/home/kemallin/Desktop/";
public void cleanCSVScript() {
String script = "clean.sh";
try {
Process awk = new ProcessBuilder("/bin/bash", scriptPath + script).start();
awk.waitFor();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}