Проблема с прямым и косвенным доступом к системной команде через Java? - PullRequest
1 голос
/ 15 февраля 2011

Я хочу вывести список всех файлов и записать список в текстовый файл, используя среду выполнения из Java.И я сделал это:

File workDir = new File("/home/name/ghost/");
String cmd = "ls -l > data.txt";
Process pr = Runtime.getRuntime().exec(cmd, null , workDir);

это не сработало, пока я не заменил команду cmd на скрипт:

String cmd = "./shell.sh";

и вот что в сценарии оболочки:

#!/bin/bash
ls -l > data.txt
exit 0

Я хочу спросить, почему я не могу получить доступ к системным командам напрямую через Java?

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

Проблема в том, что оператор > является функцией вашей оболочки, а не Java или команды ls.

Runtime.exec не пытается воспроизвести любое подобное оболочке поведение; он просто пытается выполнить команду, которую вы ему даете. Ваш второй пример работает, потому что он явно использует Bash для запуска команды ls -l > data.txt, а Bash знает, как обрабатывать >.

Вероятно, лучше использовать подход, предложенный @whaley, если можете; в противном случае использование сценария оболочки, вероятно, будет единственным способом получить семантику оболочки.

1 голос
/ 15 февраля 2011

Runtime.exec не делает то, что вы думаете, что делает. В вашей команде он вызывает «ls» с аргументами «-l», «>» и «data.txt», что и идет не так. Это как если бы вы написали это:

String[] cmd = new String[] {"ls", "-l", ">", "data.txt"};

Если вы действительно хотите вызвать оболочку и использовать оператор перенаправления оболочки, это достаточно просто, вызовите оболочку с вашей командой в качестве аргумента оболочки:

String[] cmd = new String[] {"sh", "-c", "ls -l > data.txt"};

Конечно, вы можете просто сделать это на Java, как подсказывают другие ответы.

0 голосов
/ 15 февраля 2011

Я даже не собираюсь отвечать на этот вопрос в том виде, в котором он задан, поскольку то же самое можно сделать, используя только Java, не полагаясь на внешние процессы:

    File dir = new File("/some/dir");
    FileWriter fw = new FileWriter(new File("/some/file"));
    for (File f : dir.listFiles()) {
        fw.write(f.getName() + "\n");
    }
    fw.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...