Java 无法使用运行时或ProcessBuilder执行排序命令
我正在尝试使用JavaJava 无法使用运行时或ProcessBuilder执行排序命令,java,shell,command-prompt,Java,Shell,Command Prompt,我正在尝试使用JavaRuntime和ProcessBuilder执行此命令sort--field separator=“,”--key=2/home/dummy/Desktop/sample.csv“-o/home/dummy/Desktop/sample.csv 我可以在linux中手动执行此命令,但使用运行时或ProcessBuilder时,此命令不会执行。它返回一个错误代码=2 编辑: 如果我试图通过Java在linux中执行'ls'命令,我将获得当前目录中的文件列表。但是,如果我试图执
Runtime
和ProcessBuilder
执行此命令sort--field separator=“,”--key=2/home/dummy/Desktop/sample.csv“-o/home/dummy/Desktop/sample.csv
我可以在linux中手动执行此命令,但使用运行时
或ProcessBuilder
时,此命令不会执行。它返回一个错误代码=2
编辑:
如果我试图通过Java在linux中执行'ls'命令,我将获得当前目录中的文件列表。但是,如果我试图执行'ls | grep a'命令,将抛出一个IOException,错误代码为2。
以下是片段:
public static void main(String[] args) throws IOException {
InputStream is = null;
ByteArrayOutputStream baos = null;
ProcessBuilder pb = new ProcessBuilder("ls | grep a");
try {
Process prs = pb.start();
is = prs.getInputStream();
byte[] b = new byte[1024];
int size = 0;
baos = new ByteArrayOutputStream();
while((size = is.read(b)) != -1){
baos.write(b, 0, size);
}
System.out.println(new String(baos.toByteArray()));
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try {
if(is != null) is.close();
if(baos != null) baos.close();
} catch (Exception ex){}
}
}
private String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec("script.sh");
p.waitFor();
BufferedReader reader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
您的代码可能存在一系列问题。因此,您没有提供代码,我只能猜测
import java.io.IOException;
import java.util.Arrays;
public class Test {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder(Arrays.asList("sort", "--field-separator=,", "--key=2", "/tmp/sample.csv", "-o",
"/tmp/sample_temp.csv"));
Process p = pb.start();
int returnCode = p.waitFor();
System.out.println(returnCode);
}
}
将打印“0”,并将正确排序文件
关于“ls | grep”一期,请阅读这篇伟大的文章:
本文基本上解释了Runtime.exec(和ProcessBuilder包装器)用于运行进程,而不是Shell(您正在尝试的ls | grep实际上是Linux中通过stdout/in相互通信的两个进程)
我可以手动执行。错误代码2意味着误用了Shell内置程序
在您的示例中,我看到您只调用了“ls”,而不是“/usr/bin/ls”(或类似的东西)
当您手动执行时,您可以使用PATH
环境变量,这对您创建的流程不可用
使用“
which ls
”来发现“ls”在目标系统上的位置。要使代码可移植,您必须将其设置为可配置选项。这是执行任何bash命令的方法,如sort、ls、cat(带子选项)。请查找代码段:
public static void main(String[] args) throws IOException {
InputStream is = null;
ByteArrayOutputStream baos = null;
ProcessBuilder pb = new ProcessBuilder("ls | grep a");
try {
Process prs = pb.start();
is = prs.getInputStream();
byte[] b = new byte[1024];
int size = 0;
baos = new ByteArrayOutputStream();
while((size = is.read(b)) != -1){
baos.write(b, 0, size);
}
System.out.println(new String(baos.toByteArray()));
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try {
if(is != null) is.close();
if(baos != null) baos.close();
} catch (Exception ex){}
}
}
private String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec("script.sh");
p.waitFor();
BufferedReader reader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
在exec()中方法,我传递了一个shell脚本,其中包含bash命令。该linux命令将被执行,您可以继续执行下一个任务。希望这有帮助。如果您搜索了错误代码2,则意味着无法执行该命令found@MadProgrammer但我可以手动执行。错误代码2意味着滥用Shell内置什么操作系统?什么是
sort
?通常2
意味着在尝试执行命令时,在大多数操作系统上找不到文件。问题是寻求调试帮助(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅。根据我在Windows上使用ProcessBuilder运行bulit in命令(路径)的经验我必须调用CMD.EXE/C,否则我会得到相同的错误。但是OP似乎正在运行Unix/Linux。不..请运行您的代码。它返回的错误代码是2。我已经附上了答案。请找到它。不,我工作得很好!您在/tmp目录中有这两个文件吗(请注意,我更改了文件的位置,只是为了在我的电脑上测试它)?您所做的是一个不必要的解决方法。请重新运行我的代码,我保证它工作正常,并且是您所需要的。谢谢!它像一个符咒一样工作。之前,我没有更改文件路径。对于其他命令,这通常是正确的,但是ls和cd专门内置在shell中,并且在/usr/bin或其他任何地方都不可用于该matter、 你确定吗?至少在我的系统中有一个名为/bin/ls
的二进制文件。我在这里查看了一下,它没有将ls
列为shell内置文件之一…-事实上,他的页面给出了一个命令,你可以用它来测试:键入-a ls