54030


お世話になっております。さて、コマンドラインで

`echo "Javaで外部プロセスを実行する" | /usr/local/Cellar/mecab/0.996/bin/mecab -Owakati`

と叩くと `Java で 外部 プロセス を 実行 する` が返ってくる状態で次のようなコードを書きました。

[code]

    public class MeCab {
        public static void execute()
        {
            try
            {
                String command = "echo \"Javaで外部プロセスを実行する\" | /usr/local/Cellar/mecab/0.996/bin/mecab --Owakati";
    
                String [] args = command.split(" ");
                Process process = new ProcessBuilder(args).start();
                InputStream is = process.getInputStream();
    
                InputStreamReader isr = new InputStreamReader(is, "UTF-8");
                BufferedReader reader = new BufferedReader(isr);
                StringBuilder builder = new StringBuilder();
                int c;
                while ((c = reader.read()) != -1) {
                    builder.append((char) c);
                }
    
                String text = builder.toString();
    
                int ret = process.waitFor();
                System.out.println(text);
                System.out.println(ret);
            }
            catch (IOException | InterruptedException e)
            {
    
            }
    
        }
    
        public static void main(String [] a )
        {
            execute();
        }
    }
    
[/code]

その結果

[code]

    "Javaで外部プロセスを実行する" | /usr/local/Cellar/mecab/0.996/bin/mecab --Owakati
    
    0
    
    Process finished with exit code 0
    
[/code]

となって期待通りに動作しません。mecabの標準入力に文章を与えて結果だけ受け取りたいのですが、どうしたらできるでしょうか？

なお、MeCabのJavaバインディングやKuromojiといった同種のプログラムのJava実装があることは知っていますが、今回は外部プロセスでMeCabを呼びたい事情があります。

開発環境は Mac OS X Ver. 10.14.4と

[code]

    java version "1.8.0_131"
    Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
    
[/code]

ですが、本番環境はCentOS 6になります。

よろしくお願いします。


CC BY-SA 4.0
2019-04-09T00:12:41.787
54028
2019-04-09T02:54:19.967
14631
question
java shell
Javaから echo, パイプ, mecabを含むコマンドを実行して結果を文字列で得たい

[code]

    String [] args = command.split(" ");
    
[/code]

この行を次のように変更してみて下さい。

[code]

    String[] args = {"/bin/sh", "-c", command};
    
[/code]

パイプを使用するには、シェルを起動してからそのシェル内でコマンドを実行する必要があります。


CC BY-SA 4.0
2019-04-09T01:02:52.423
54030
2019-04-09T01:02:52.423
21092
54028
answer


Qiitaの
[Javaで外部プロセス実行(システムコール)を行う](https://qiita.com/suzuki_y/items/212ae68059a2c340b79c)
という記事の２つ目のサンプルに 「外部プロセスを実行した結果を取得する(サンプル：mecabで形態素解析を行った結果を取得する)」というのがあります。

参考になるのではないでしょうか。


CC BY-SA 4.0
2019-04-09T02:54:19.967
54036
2019-04-09T02:54:19.967
217
54028
answer