Rog*_*ach 5 java shell escaping
我需要在linux shell命令中使用文件名作为参数.问题是,java给了我这个名字,保存了所有空格和其他字符,因此shell抱怨.有没有一种方法可以在将字符串传递给shell之前转义所有有问题的字符?
Mik*_*rge 10
有同样的问题,单引号是不够的(罗伯特已经指出)
解:
import com.google.common.escape.Escaper;
import com.google.common.escape.Escapers;
public class YourFancyClass {
public static final Escaper SHELL_ESCAPE;
static {
final Escapers.Builder builder = Escapers.builder();
builder.addEscape('\'', "'\"'\"'");
SHELL_ESCAPE = builder.build();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这么复杂的替代?这就是为什么.
使用案例:
System.out.format("ln -f '%s' '%s'%n",
SHELL_ESCAPE.escape(anyOrig.toString()),
SHELL_ESCAPE.escape(duplicate.toString()));
Run Code Online (Sandbox Code Playgroud)
按预期工作:
ln -f '/home/user/Musik/mix-2012-13/aesthesys~ I Am Free, That Is Why I'"'"'m Lost..mp3' '/home/user/Musik/youtube converted/aesthesys~ I Am Free, That Is Why I'"'"'m Lost..mp3'
Run Code Online (Sandbox Code Playgroud)