簡體   English   中英

Runtime.exec無法正常工作

[英]Runtime.exec not working

我正在嘗試運行以下代碼來交換文件名。 我正在使用Runtime.exec 代碼拋出IOException 有任何解決這個問題的方法嗎?

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

而錯誤:

02-28 07:48:02.936:W / System.err(14399):java.io.IOException:運行exec()時出錯。 命令:[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”,&&,/ system / xbin / mv,$ temp /“$ file1”, “$ file2”]工作目錄:null環境:null

看起來Runtime.exec在每個&&之前和之后插入一個昏迷 似乎問題在於Runtime.exec解釋&&的方式 為什么會這樣? 我怎么能阻止這個?

如果使用Runtime.exec(String)重載,則將字符串視為命令及其參數,並粗略地拆分為白色空間邊界處的子字符串。 這種分裂是該過載的標准行為。 (請參閱javadoc。)

Runtime.exec(...)需要本機命令及其參數。 你提供了一系列shell輸入。 exec方法不了解shell輸入,也不知道如何正確執行它。 原油分裂(見上文)會弄亂一切。

如果您需要這樣做,請使用以下內容:

String yourShellInput = "echo hi && echo ho";  // or whatever ... 
String[] commandAndArgs = new String[]{ "/bin/sh", "-c", yourShellInput };
Runtime.getRuntime().exec(commandAndArgs);

這相當於運行:

$ /bin/sh -c "echo hi && echo ho".

如果未安裝sh作為/bin/sh使用安裝它的路徑。

首先問題不是你想的“看起來Runtime.exec在每個&&之前和之后插入一個逗號”實際上錯誤語句報告你在Runtime.exec()中給出的命令為String數組(String [ ])。 這是Java Runtime.exec()方法的標准行為。

02-28 07:48:02.936: 
W/System.err(14399): java.io.IOException: 
Error runningexec(). Command: 
[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", &&, /system/xbin/mv, $temp/"$file1", "$file2"] 
Working Directory: null Environment: null

您可以在錯誤中看到Java如何解釋您硬編碼的命令,您回來的String數組顯示“file1 = / mnt / sdcard / fsimages_3”被視為要執行的打開命令,其余為“&&”“ file2 = / mnt / sdcard / fsimages“等被視為參數。

我認為你應該做的是首先嘗試將命令拆分為類似結構的數組。 以下是一個例子

Process process;
String[] commandAndArgs = new String[]{ "/bin/sh", "mv", "/mnt/sdcard/fsimages_3","/mnt/sdcard/fsimages" };
process = Runtime.getRuntime().exec(commandAndArgs);

接下來,您的錯誤顯示您的工作目錄為null,您的Environment也為null。 所以你需要為你的過程設置它們。 從Java文檔中,您可以看到它聲明了這個exec()重載方法

exec(String[] cmdarray, String[] envp, File dir)

在具有指定環境和工作目錄的單獨進程中執行指定的命令和參數。

如果沒有任何說明可行,我請求您為您的命令編寫一個shell腳本文件,然后使用它設置它可執行文件

chmod 755 or chmod +x script.sh;

然后嘗試運行它。 我希望它在我的情況下工作,腳本文件方法工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM