Я пытаюсь выполнить эту команду sort --field-separator="," --key=2/home/dummy/Desktop/sample.csv" -o/home/dummy/Desktop/sample_temp.csv
с использованием Java Runtime
и ProcessBuilder
.
Вручную я могу выполнить эту команду в Linux, но используя Runtime
или ProcessBuilder
, эта команда не выполняется. Он возвращается с error code = 2
.
Редактировать:
Если я пытаюсь выполнить команду ls в linux через Java, я получаю список файлов в текущем каталоге. Но, если я попытаюсь выполнить команду '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){}
}
}
В вашем коде может быть ряд проблем. Следовательно, вы не предоставили свой код, я могу только догадываться.
Итак, после этих 2-х проблем (оба выхода программы с "2"), этот код действительно работает:
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 ', прочитайте эту замечательную статью: http://www.javaworld.com/article/2071275/core-javahen-runtime-exec---won-t/core-java/when-runtime-exec---won -t.html
В статье в основном объясняется, что Runtime.exec (и обертка ProcessBuilder) предназначена для запуска процессов, а не для оболочки (ls | grep, который вы пытаетесь на самом деле - это 2 процесса в Linux, которые взаимодействуют друг с другом через stdout/in).
это способ выполнить любые команды bash, такие как sort, ls, cat (с дополнительными опциями). Пожалуйста, найдите фрагмент:
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() я передал скрипт оболочки, содержащий внутри него команду bash. Эта команда linux будет выполнена, и вы можете продолжить следующую задачу. Надеюсь, это было полезно.
Я могу выполнить это вручную. И код ошибки 2 означает неправильное использование встроенных оболочек
В вашем примере я вижу только "ls", а не "/usr/bin/ls" (или что-то в этом роде).
Когда вы выполняете вручную, у вас есть роскошь PATH
среды PATH
которая недоступна для процесса, который вы создаете.
Используйте " which ls
", чтобы обнаружить местоположение "ls" в вашей целевой системе. Чтобы ваш код был портативным, вам нужно будет настроить его.
/bin/ls
. Я посмотрел здесь, и он не перечисляет ls
как одну из встроенных оболочек ... cyberciti.biz/faq/… - на самом деле его страница дает команду, которую вы можете использовать для проверки этого: type -a ls