Невозможно выполнить команду сортировки, используя Runtime или ProcessBuilder

1

Я пытаюсь выполнить эту команду 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){}
    }
}
  • 0
    Код ошибки 2, если вы его искали, означает, что команда не может быть найдена
  • 0
    @MadProgrammer Но я могу выполнить это вручную. И код ошибки 2 означает неправильное использование встроенных оболочек
Показать ещё 4 комментария
Теги:
command-prompt

3 ответа

2
Лучший ответ

В вашем коде может быть ряд проблем. Следовательно, вы не предоставили свой код, я могу только догадываться.

  1. Выходной файл должен быть уже создан
  2. Сепаратор поля "," не нуждается в кавычках вокруг него (см. Код ниже)

Итак, после этих 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).

  • 0
    Нет .. Пожалуйста, запустите ваш код. Возвращает код ошибки 2. Я приложил ответ. Пожалуйста, найдите это.
  • 0
    Нет, я работаю как шарм! Есть ли у вас оба файла в каталоге / tmp (обратите внимание, что я меняю расположение файлов только для того, чтобы проверить его на моем ПК)? То, что вы сделали, это ненужный обходной путь. Пожалуйста, повторите мой код, я гарантирую, что он работает и это то, что вам нужно.
Показать ещё 1 комментарий
0

это способ выполнить любые команды 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 будет выполнена, и вы можете продолжить следующую задачу. Надеюсь, это было полезно.

0

Я могу выполнить это вручную. И код ошибки 2 означает неправильное использование встроенных оболочек

В вашем примере я вижу только "ls", а не "/usr/bin/ls" (или что-то в этом роде).

Когда вы выполняете вручную, у вас есть роскошь PATH среды PATH которая недоступна для процесса, который вы создаете.

Используйте " which ls ", чтобы обнаружить местоположение "ls" в вашей целевой системе. Чтобы ваш код был портативным, вам нужно будет настроить его.

  • 0
    Как правило, это верно для других команд, но ls и cd специально встроены в оболочку и не доступны в / usr / bin или где-либо еще в этом отношении.
  • 0
    Вы уверены, что? По крайней мере, в моей системе есть бинарный файл /bin/ls . Я посмотрел здесь, и он не перечисляет ls как одну из встроенных оболочек ... cyberciti.biz/faq/… - на самом деле его страница дает команду, которую вы можете использовать для проверки этого: type -a ls
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню