Runtime.exec no funciona
Estoy tratando de ejecutar el siguiente código para intercambiar nombres de archivo. Estoy utilizando Runtime.exec
. El código lanza IOException
. ¿Cualquier forma de arreglar esto?
try { Runtime.getRuntime().exec("file1=" + folderpath + " && file2=/mnt/sdcard/fsimages && temp=\"$(/system/xbin/mktemp -dp /mnt/sdcard)\" && /system/xbin/mv \"$file1\" $temp && /system/xbin/mv \"$file2\" \"$file1\" && /system/xbin/mv $temp/\"$file1\" \"$file2\""); } catch (IOException e) { e.printStackTrace(); return; }
Y el error:
- Cómo obtener datos de tráfico de conexión
- Fastboot y adb no funcionan con sudo
- Generar android apk utilizando shell script de php?
- Dificultades para llamar directamente a una función NDK de Android directamente de Delphi
- Ant no puede encontrar javac, JAVA_HOME no se establecerá en Ubuntu
02-28 07: 48: 02.936: W / System.err (14399): java.io.IOException: Error al ejecutar exec (). Comando: [file1 = / mnt / sdcard / fsimages_3, &&, file2 = / mnt / sdcard / fsimages, &&, temp = "$ (/ system / xbin / mktemp, -dp, / mnt / sdcard) system / xbin / mv, "$ file1", $ temp, &&, / system / xbin / mv, "$ file2", "$ file1" "$ file2"] Directorio de trabajo: null Medio ambiente: null
Parece que Runtime.exec está insertando un coma antes y después de cada && . Parece que el problema está en la forma en que Runtime.exec interpreta && . ¿Por qué está pasando esto? ¿Cómo puedo evitar esto?
- Android Studio no se comunica con adb GLIBC ... no se encuentra el error
- No se pudo obtener la versión del anuncio ... Ningún archivo o directorio
- Ningún archivo o directorio 'mientras intenta obtener la versión de adb
- Diferencias de parches entre el kernel de android y el kernel de linux de vainilla
- Fclose funciona de forma diferente en android y linux
- android no puede encontrar un objetivo
- Posicione ejecutables independientes y Android Lollipop
- Android Studio - No se pudo determinar la versión de Java
Si utiliza la sobrecarga Runtime.exec(String)
, la cadena se tratará como un comando y sus argumentos y se dividirá en subcadenas en los límites de espacios blancos. Esta división es un comportamiento estándar para esa sobrecarga. (Consulte el javadoc.)
Runtime.exec(...)
espera un comando nativo y sus argumentos. Ha proporcionado una línea de entrada de shell. Los métodos exec no entienden la entrada de la shell y no saben cómo ejecutarla correctamente. Y la división cruda (ver arriba) desordena todo.
Si necesita hacerlo, utilice lo siguiente:
String yourShellInput = "echo hi && echo ho"; // or whatever ... String[] commandAndArgs = new String[]{ "/bin/sh", "-c", yourShellInput }; Runtime.getRuntime().exec(commandAndArgs);
Esto es equivalente a ejecutar:
$ /bin/sh -c "echo hi && echo ho".