Проблема при выполнении команды tar -ztf в Java - PullRequest
1 голос
/ 16 июля 2010

Я пытаюсь запустить «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();
    }

Ответы [ 2 ]

2 голосов
/ 16 июля 2010

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

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

2 голосов
/ 16 июля 2010

В командной строке оболочка выполняет всю работу за вас.Только аргументы перед | передаются в 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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...