2

ディストリビューション名を確認したいのですが、bash の実行コマンドに問題があります。このコードが正常に機能し、フォルダーの内容を出力する理由

String cmd[] = {"ls","-a"};
Runtime run = Runtime.getRuntime(); 
try {
    Process proc = run.exec(cmd);
    BufferedReader read=new BufferedReader(new InputStreamReader(proc.getInputStream()));
    while(read.ready()) {
        System.out.println(read.readLine());
    }
} catch (IOException e) {
    e.printStackTrace();
}   

しかし、cmd[] = {"cat","/etc/*-release"};そうではありませんか?エラーもディストリビューションも何も出力しません。オフ。ターミナルで動作します。それの何が問題なのですか?

4

3 に答える 3

4

Bashで機能する理由は、Bashが/etc/*-releaseglobとして認識し、必要なファイル名拡張を実行するためです。Processそれをしません。cat指定した正確な引数で呼び出すだけです。(つまり、Bashコマンドと同等のコマンドを実行していますcat '/etc/*-release'。)

1つのオプションは、実際にBashを呼び出して、それを処理させることだと思います。

String cmd[] = { "bash", "-c", "cat /etc/*-release" };

/etcただし、JavaファイルシステムAPIを使用して、名前が。で終わるファイルを検索し、-releaseそのファイルの内容を通常どおりに読み取る方が理にかなっていると思います。(のJavadocjava.io.FileおよびのJavadocjava.io.FileReaderを参照してください。)

于 2012-10-26T19:16:53.470 に答える
0

Runtime.execシェル (bash など) を呼び出さず、プロセスを直接起動します。bashと入力ls /etc/*-releaseすると、bash 自体が * をパターンに一致するすべてのファイル名に展開します。そのため、bash が ls コマンドを呼び出すと、ls は実際のファイル名を引数として認識します。一方、Java コードが ls コマンドを呼び出すと、ls は実際の文字列 "/etc/*-release" を認識しますが、これは存在しないファイルです。

最も簡単な修正は、/etc/lsb-release を渡すことです。より良い解決策は、 を呼び出すことlsb_release -cです。

于 2012-10-26T19:26:19.477 に答える
0

これを試して:

    String[] cmd = {
    "/bin/sh", "-c", "cat /etc/*-release" };

    try {
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader bri = new BufferedReader(new InputStreamReader(
                p.getInputStream()));

        String line = "";
        while ((line = bri.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {

        e.printStackTrace();
    }
于 2012-10-26T19:22:32.953 に答える