rm -rf не работает с домашней тильдой во время выполнения Java

Это мой код для удаления папки, этот код ниже не удаляет каталог загрузок в домашней папке.

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 ..!!");
        }
        }

Кто-нибудь может сказать мне, что я делаю не так?

4 ответа

Тильда (~) расширяется оболочкой. Когда вы звоните exec оболочка не вызывается, а rm Двоичный файл вызывается немедленно, поэтому тильды не раскрываются. Также не подстановочные знаки и переменные среды.

Есть два решения. Либо замените тильду на себя так:

String path = "~/Downloads/2".replace("~", System.getProperty("user.home"))

или вызвать оболочку, добавив префикс вашей командной строки следующим образом

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

Расширение тильды выполняется оболочкой (например, bash), однако вы работаете rm непосредственно, так что нет оболочки для интерпретации ~, Я настоятельно рекомендую не полагаться на вызов оболочки для таких функций - они подвержены ошибкам, имеют плохие свойства безопасности и ограничивают операционные системы, в которых может выполняться ваш код.

Однако, если вы действительно решили использовать этот конкретный метод, вы можете сделать:

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "rm -rf ~/Downloads/2" })

Вы используете синтаксис оболочки без оболочки. Измените команду на эту:

new String[]{"sh", "-c", "rm -rf ~/Downloads/2"}

Вы можете использовать переменную окружения, такую ​​как $HOME, если использовать тильду не нужно.

String homeDir = System.getenv("HOME"); Runtime.getRuntime().exec("rm -rf " + homeDir + "/Downloads/2");

Другие вопросы по тегам