【问题标题】:Unable using Runtime.exec() to execute shell command "echo" in Android Java code无法使用 Runtime.exec() 在 Android Java 代码中执行 shell 命令“echo”
【发布时间】:2017-06-02 00:29:01
【问题描述】:

我可以使用Runtime.exec() 来执行诸如“getprop”和“ls system”之类的shell 命令,它们工作正常。

但是,当我使用“echo $BOOTCLASSPATH”、“echo \\$BOOTCLASSPATH”或“echo HelloWorld”时,它不会在标准输出中显示。

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();
}

【问题讨论】:

  • 希望this能帮到你。
  • 你的系统好像没有/bin/echo; echo 也可用作 shell 命令。尝试执行sh -c "echo -e \\$BOOTCLASSPATH"
  • @user3505725 该链接指的是 Windows 上的问题。伊克。
  • 我试过这个:String[] cmdline = { "sh", "-c", "echo $BOOTCLASSPATH" };Runtime.getRuntime().exec(cmdline);,它可以工作。谢谢你们。
  • 感谢好友@QYLin,你救了我的命。你能详细说明为什么会这样吗?

标签: java android shell echo runtime.exec


【解决方案1】:

@Adi Tiwari,我找到了原因。 Runtime.getRuntime.exec() 不直接执行 shell 命令,它执行带有参数的可执行文件。 “echo”是一个内置的 shell 命令。它实际上是带有选项-c 的可执行文件sh 的参数的一部分。 像ls 这样的命令是实际的可执行文件。 您可以在adb shell 中使用type echotype ls 命令来查看区别。
所以最终代码是:

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

【讨论】:

  • 注意:我想更好地理解这个解释——尤其是背后的理论部分——我发现 this article 对这个目的绝对有用
  • 对不起,这是一个老话题,但是在这种情况下,多命令而不是一个回显命令呢?
  • 有点惊讶的是,没有人提到 shell 内置程序(包括 echo)通常具有可执行的关联。在大多数普通的 linux 系统上,which echo 将返回 /bin/echo,但 type echo 将返回 echo is a shell builtin。然而,在 Android 上情况并非如此。
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 2011-06-30
  • 2011-10-16
  • 1970-01-01
相关资源
最近更新 更多