0

スクリプトの作成に成功した後、必要な情報を含むファイルを生成する単一のコマンドを持つシェルスクリプトがあります。

そのコマンドを直接実行するか、コマンドラインからスクリプト自体を実行すると、ファイルが生成されます。

しかし、ファイルを使用して Java コードから同じスクリプトを実行しようとすると、Runtime.getRuntime().exec(cmd)生成されません。この行の直前と直後のトレースが期待どおりに表示され、スクリプトの実行で例外がスローされていないことが示されます。

どこが間違っているのか、何が欠けているのでしょうか? 助けてください!!!

例 これは実行しようとしているコードです

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Scripttest {
public static void main(String args[])
{
        try{
String cmd="ls|grep sys";
        Process p=Runtime.getRuntime().exec(cmd);
        System.out.println("done");
        final BufferedReader input = new BufferedReader(new InputStreamReader( p.getInputStream()));
        String line = null;
        while ((line = input.readLine()) != null)
         System.out.println("proc: " + line);
}
        catch(Exception e)
        {
                System.out.println("Exception is"+e);
        }
}
}

そして出力iam取得はこれです

java Scripttest
Exception isjava.io.IOException: Cannot run program "ls|grep": error=2, No such file or directory

cmd は実行されませんが、実行されない理由がよくわかりません。

4

2 に答える 2

2

これは、パイプを使用するのと同じように行う例です。この例では、スクリプトがJavaに埋め込まれています。

import java.io.*;
class junk {
 public static void main (String args[]) {
  try {
   String line; String script;
   OutputStream stdin = null; InputStream stderr = null; InputStream stdout = null;
   Process p = Runtime.getRuntime ().exec ("/bin/bash");
   stdin = p.getOutputStream (); stderr = p.getErrorStream (); stdout = p.getInputStream ();
   script = "a=$(cat <<'@@@'\n" +
"ICAgICBfCiAgICB8IHwgX18gX19fICAgX19fXyBfICAgIF9fXyBfXyBfIF8gX18gICAgXyBfXyBfICAg" +
"XyBfIF9fCiBfICB8IHwvIF9gIFwgXCAvIC8gX2AgfCAgLyBfXy8gX2AgfCAnXyBcICB8ICdfX3wgfCB8" +
"IHwgJ18gXAp8IHxffCB8IChffCB8XCBWIC8gKF98IHwgfCAoX3wgKF98IHwgfCB8IHwgfCB8ICB8IHxf" +
"fCB8IHwgfCB8CiBcX19fLyBcX18sX3wgXF8vIFxfXyxffCAgXF9fX1xfXyxffF98IHxffCB8X3wgICBc" +
"X18sX3xffCB8X3wKICAgICAgICAgICAgICAgICAgICBfICAgICAgICAgICAgICAgXwogICAgICAgICAg" +
"ICAgICAgICAgfCB8X18gICBfXyBfIF9fX3wgfF9fCiAgICAgICAgICAgICAgICAgICB8ICdfIFwgLyBf" +
"YCAvIF9ffCAnXyBcCiAgICAgICAgICAgICAgICAgICB8IHxfKSB8IChffCBcX18gXCB8IHwgfAogICAg" +
"ICAgICAgICAgICAgICAgfF8uX18vIFxfXyxffF9fXy9ffCB8X3wK" +
"\n" +
"@@@)\n" +
"st=0\n" +
"for (( i=0; i<\"${#a}\"; i++ ))\n" +
"do\n" +
" x=${a:$i:1}\n" +
" in=$(($(expr index \\\n" +
" 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' \"\\\\$x\")-1))\n" +
" if [ $in -ge 0 ]; then case $st in\n" +
"  0 ) out=$(($in<<2)); st=3;;\n" +
"  1 ) out=$(($out|$in)); \n" +
"    printf \\\\$(printf '%03o' $(($out&255)) ) ; st=0 ;;\n" +
"  2 ) out=$(($out+($in>>2))); \n" +
"    printf \\\\$(printf '%03o' $(($out&255)) ) ;\n" +
"    st=0; out=$(($in<<6)); st=1;;\n" +
"  * ) out=$(($out+($in>>4))); \n" +
"    printf \\\\$(printf '%03o' $(($out&255)) ) ;\n" +
"    st=0; out=$(($in<<4)); st=2;;\n" +
"  esac fi\n" +
"done\n";
   stdin.write (script.getBytes ());
   stdin.close ();
   BufferedReader br = new BufferedReader (new InputStreamReader (stdout));
   while ((line = br.readLine ()) != null) { System.out.println(line); }
   br.close ();
   br = new BufferedReader (new InputStreamReader (stderr));
   while ((line = br.readLine ()) != null) { System.out.println ("2>" + line); }
   br.close ();
   p.waitFor ();
   System.out.println ("exit code " + p.exitValue ());
  }
  catch (IOException e) { e.printStackTrace (); }
  catch (java.lang.InterruptedException e) { e.printStackTrace (); }
 }
}
于 2012-06-28T08:06:18.640 に答える
0

コマンドls|grep sysは、2つの主要なコマンドlsとgrepで構成されているため、配列に保持します。

または

最良のアイデアは、Linuxではシェルスクリプトを使用し、Windowsではバッチファイルを使用することです。コマンドを使用して要件に応じてシェルスクリプトまたはバッチファイルを作成し、Javaコードからシェルスクリプトまたはバッチファイルを実行するだけです。

于 2013-02-08T05:30:19.470 に答える