我想知道什么是所有需要逃避Linux路径的char。例如,路径/ home / user1 / My Music / song 1.mp3需要在shell中为ls命令'ls / home / user1 / My \ Music / song \ 1.mp3'进行转义。
我想编写一个函数,它将String作为路径并转义所有需要的字符。在斯卡拉我有:
def normalizePath(path: String): String = {
var normPath = path.replaceAll(" ", "\\\\ ")
normPath = normPath.replaceAll("\\]", "\\\\]")
normPath = normPath.replaceAll("\\[", "\\\\[")
normPath
}
知道有更多的char需要转义。此外,这可能可以通过一个命令(更复杂的正则表达式)来完成?
答案 0 :(得分:7)
你不应该继续这样做。有很多方法可以解决这个问题(例如设置FS
环境变量)。只需使用ProcessBuilder
类来传递命令行参数。
ProcessBuilder proc = new ProcessBuilder("ls", "/home/user1/My Music/song 1.mp3");
proc.start();
答案 1 :(得分:2)
我认为引用字符串比逃避字符串更简单。单引号的算法是:
所以这很容易。
但是,我喜欢ProcessBuilder的答案,如果它适合你,那就更容易了。
如果你不需要任何shell功能并且只想产生一个进程,那么完全避免shell既可以获得性能也可以获得安全性。
如果您确实想要使用转义,我建议使用白名单而不是将字符列入黑名单。即逃避任何不是[a-zA-Z0-9_]或其他东西的东西。除换行符外,任何字符都可以转义。反斜杠后跟换行意味着“删除反斜杠和换行符” - 如果不在引号之外。在双引号内,我认为你可以使用反斜杠转换换行符然后换行。在单引号内,我不认为你必须(或可以)转义换行符,只需附加换行符。
一个很好的参考是“Shell命令语言”http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
的UNIX98规范答案 2 :(得分:0)
单引号可防止shell扩展,因此您只需:
def normalizePath(path: String): String = "'" + path.replace("'", "\\'") + "'"