0

私はこれをやろうとしています

echo "ls|head -3"|/bin/sh

Javaで。

重要な点は、スクリプト文字列をオンザフライで作成し、そのスクリプトを使用してシェル プロセスを実行し、スクリプトの stdout をキャッチすることです。

上記のコードは機能せず、おそらく入力ストリームでハングします。

        Process p = Runtime.getRuntime().exec("/bin/sh");

        final OutputStream out = p.getOutputStream();
        final BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));

        final String cmd = "ls|head -3";

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    out.write(cmd.getBytes());
                    out.flush();
                } catch (IOException ex) {
                }
            }
        }).start();


        final List list = new ArrayList();

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String line;
                    while ((line = in.readLine()) != null) {
                        list.add(line);
                    }
                } catch (IOException ex) {
                }
            }
        }).start();

        System.err.println("running ...");
        p.waitFor();

        System.err.println(list);

    }
4

1 に答える 1

0

入力ストリームにデータが存在する前に、出力ストリームを閉じる必要があります。出力ストリームを閉じると、それ以上入力が来ないことがプロセスに確認されます。そうして初めて、処理と入力ストリームへの出力が開始されます。

「フラッシュ」への呼び出しの後に、最初のスレッドに次のコードを追加してみてください。

out.close();
于 2013-02-06T18:34:57.390 に答える