web-dev-qa-db-ja.com

Runtime.exec()を使用してAndroid Java codeでシェルコマンド "echo"を実行できません

Runtime.exec()を使用して、「getprop」や「ls system "そしてそれらはうまく機能します。

ただし、「echo $BOOTCLASSPATH "、" echo \\$BOOTCLASSPATH "または" echo HelloWorld "、stdoutには表示されません。

Logcatは次のことを示しています。

I/AndroidRuntime( 4453): VM exiting with result code -1.

これが私のコードです:

try {
    Java.lang.Process proc = Runtime.getRuntime().exec("echo -e \\$BOOTCLASSPATH");
    String line = null;

    InputStream stderr = proc.getErrorStream();
    InputStreamReader esr = new InputStreamReader (stderr);
    BufferedReader ebr = new BufferedReader (esr);
    while ( (line = ebr.readLine()) != null )
        Log.e("FXN-BOOTCLASSPATH", line);

    InputStream stdout = proc.getInputStream();
    InputStreamReader osr = new InputStreamReader (stdout);
    BufferedReader obr = new BufferedReader (osr);
    while ( (line = obr.readLine()) != null )
        Log.i("FXN-BOOTCLASSPATH", line);

    int exitVal = proc.waitFor();
    Log.d("FXN-BOOTCLASSPATH", "getprop exitValue: " + exitVal);
} catch (Exception e) {
    e.printStackTrace();
}
13
QY Lin

@Adi Tiwari、原因を見つけました。 Runtime.getRuntime.exec()は、シェルコマンドを直接実行するのではなく、引数を使用して実行可能ファイルを実行します。 「echo」は組み込みのシェルコマンドです。これは実際には、オプション-cを指定した実行可能ファイルshの引数の一部です。 lsのようなコマンドは実際の実行可能ファイルです。 type echotype lsおよびadb Shellコマンドを使用して、違いを確認できます。
つまり、最終的なコードは次のとおりです。

String[] cmdline = { "sh", "-c", "echo $BOOTCLASSPATH" }; 
Runtime.getRuntime().exec(cmdline);
18
QY Lin