Проблема при выполнении команды "tar -ztf" в Java

57
3

Я пытаюсь запустить "tar -ztf/users/home/test.tar.gz | head -1" в Java, который работал, когда я пытался запустить его в командной строке unix напрямую.

В результате этой команды будет отображаться одна строка файла/папки внутри test.tar.gz.
например: proj/test/test_dir

Но я, когда я запускаю его в java. он даст эту ошибку:


Running command: tar -ztf /users/home/test.tar.gz | head -1
[java] tar: Options `-[0-7][lmh]' not supported by *this* tar
[java] Try `tar --help' for more information.

Любая идея, что с ним не так? почему это связано с опцией "указать диск и плотность"?


Код, который я выполнил:


 String s = null;
StringBuffer sbOutput = new StringBuffer();
StringBuffer errorInfo = new StringBuffer();
String[] cmd = {"tar", "-ztf", fileName, "|", "head", "-1"};
try
{
Runtime rt = Runtime.getRuntime();
System.out.println("Running command: " + cmd[0] + " " + cmd[1] + " " + cmd[2] + " " + cmd[3] + " " + cmd[4] + " " + cmd[5]);
Process p = rt.exec(cmd);

BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

//If there is an error - only show that
while ((s = stdError.readLine()) != null)
{
errorInfo.append(s + "\n");
}
if (errorInfo.length() > 0)
{
System.out.println(errorInfo.toString());
}

while ((s = stdInput.readLine()) != null) {
sbOutput.append(s + "\n");
}

// wait for end of command execution
try {
p.waitFor();
} catch (InterruptedException ie) {
new LogErrThread(ie).start();
ie.printStackTrace();
}

p.destroy();

if (sbOutput.length() > 0)
{
System.out.println(sbOutput.toString());

}

}
catch (IOException e)
{
new LogErrThread(e).start();
e.printStackTrace();
}

спросил(а) 2010-07-16T08:35:00+04:00 10 лет, 3 месяца назад
1
Решение
71

В командной строке оболочка делает для вас трубку. Только аргументы перед | передаются в gtar. Ваш код неправильно передает трубку и остальную часть текста в качестве аргументов в gtar.


К счастью, решение прост. Вы можете просто прочитать первую строку самостоятельно.

String[] cmd = {"gtar", "-ztf", fileName};

// ...

// Instead of current input loop.
s = stdInput.readLine();
if(s != null) {
sbOutput.append(s + "\n");
}

while (stdInput.readLine() != null) {
// Disregard. Reading to end to prevent hang.
}

ответил(а) 2010-07-16T08:38:00+04:00 10 лет, 3 месяца назад
71

Чтобы уточнить точку Мэтью, оператор | интерпретируется оболочкой. Чтобы запустить вашу команду без оболочки, вам нужно будет запустить программы отдельно и соединить их трубы вместе (сложно в Java).

Если вы входите в санацию, вы можете вызвать оболочку и дать ей команду для запуска. Его более легкий подход, хотя, возможно, менее портативный. В общем случае переменная среды SHELL содержит оболочку пользователя. Оболочки также имеют стандартизованный defacto параметр -c для передачи им командной строки в argv. Если вы вызываете $SHELL -c [command string], вы должны получить нужное поведение.

ответил(а) 2010-07-16T08:42:00+04:00 10 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема