Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
rm-rf不能在java运行时使用home tilde_Java_Rm - Fatal编程技术网

rm-rf不能在java运行时使用home tilde

rm-rf不能在java运行时使用home tilde,java,rm,Java,Rm,这是我删除文件夹的代码,下面的代码不会删除主文件夹下的下载目录 import java.io.IOException; public class tester1{ public static void main(String[] args) throws IOException { System.out.println("here going to delete stuff..!!"); Runtime.getRuntime().exec("

这是我删除文件夹的代码,下面的代码不会删除主文件夹下的下载目录

import java.io.IOException;
public class tester1{   
        public static void main(String[] args) throws IOException {
        System.out.println("here going to delete stuff..!!");
        Runtime.getRuntime().exec("rm -rf ~/Downloads/2");
        //deleteFile();
        System.out.println("Deleted ..!!");     }    
}
但是,如果我给出完整的主路径,这将起作用:

   import java.io.IOException;
    public class tester1{   
            public static void main(String[] args) throws IOException {
            System.out.println("here going to delete stuff..!!");
            Runtime.getRuntime().exec("rm -rf /home/rah/Downloads/2");
            //deleteFile();
            System.out.println("Deleted ..!!");
        }
        }

有人能告诉我我做错了什么吗?

您使用的是没有shell的shell语法。将命令更改为:

new String[]{"sh", "-c", "rm -rf ~/Downloads/2"}
波浪线(
~
)由shell展开。调用
exec
时,不会调用shell,而是立即调用
rm
二进制文件,因此不会展开tilde。通配符和环境变量也不是

有两种解决办法。或者像这样更换瓷砖:

String path = "~/Downloads/2".replace("~", System.getProperty("user.home"))
或者通过在命令行前面加前缀来调用shell,如下所示

Runtime.getRuntime().exec("sh -c rm -rf ~/Downloads/2");

tilde扩展由shell(例如bash)完成,但是,您直接运行的是
rm
,因此没有shell来解释
~
。我强烈建议不要依赖于调用shell来实现这些函数——它们容易出错,安全性差,并且限制了代码可以运行的操作系统

但是,如果您确实决定使用此特定方法,您可以:


Runtime.getRuntime().exec(新字符串[]{/bin/bash“,“-c”,“rm-rf~/Downloads/2”})
如果不需要使用tilde,可以使用环境变量,例如$HOME。

String homeDir=System.getenv(“HOME”);

Runtime.getRuntime().exec(“rm-rf”+homeDir+“/Downloads/2”)

您可以将错误消息添加到其中吗?可能
~
未扩展到用户主页。尝试改用
System.getProperty(“user.home”)
。这也不起作用,因为-c的值必须是“一个字符串”,java会将其视为“sh”“-c”“rm”“-rf”“~/Downloads/2”而不是“sh”“-c”“rm-rf~/Downloads/2”,要修复它,OP必须使用
exec(新字符串[]{“sh”“,“-c”,“rm-rf~/Downloads/2”)取而代之。把你的头发修好answer@morgano我已经做出了建议的改变,因为这是在更具体的方向上的改进,但我不接受“这也行不通”的说法。我只说了命令应该是什么,我说得对。我没有说任何关于如何分割命令的内容。前缀是不够的,因为
Runtime.exec(String)
已被终止,不应使用。使用shell执行的方式是
Runtime.getRuntime().exec(新字符串[]{“sh”、“-c”、“rm-rf~/Downloads/2”})是的,避免引用问题和其他问题要好得多。你是在想我不知道的其他事情吗?这是命令运行所必需的。如果没有阵列版本,该命令相当于
sh-crm