【问题标题】:What are all possible linux path chars that need escaping需要转义的所有可能的 linux 路径字符是什么
【发布时间】:2010-11-05 03:18:30
【问题描述】:

我想知道为 linux 路径转义所需的所有字符是什么。例如,路径 /home/user1/My Music/song 1.mp3 需要在 ls 命令 'ls /home/user1/My\ Music/song\ 1.mp3' 的 shell 中进行转义。

我想编写一个函数,将字符串作为路径并转义所有需要的字符。在斯卡拉我有:

  def normalizePath(path: String): String = {
var normPath = path.replaceAll(" ", "\\\\ ")
normPath = normPath.replaceAll("\\]", "\\\\]")
normPath = normPath.replaceAll("\\[", "\\\\[")

normPath

}

知道有更多的字符需要转义。另外,这可能可以通过一个命令来完成(更复杂的正则表达式)?

【问题讨论】:

  • 是的string normalize(string s) { return "\"" + s + "\""; }
  • 为什么不首先不使用外壳呢?
  • 答案取决于您计划在哪里使用该路径。例如,如果要传递给 shell,那么您需要转义 shell 解释的特殊字符(可能包括 '!'、'*'、'?' 等,并且可能取决于 shell 是什么正在使用)。如果将路径放入 URL,则需要转义一组不同的字符,并使用不同的转义机制(%-encode)。而且,如果您将路径直接用于 Linux 系统调用,则根本不需要转义。
  • 当您必须处理这么多反斜杠时,您可以使用不需要转义反斜杠的多行字符串文字。例如。 "\\\\" 将变为 """\\"""
  • 无效字符(以及其他路径限制)部分取决于文件系统。

标签: java regex linux scala


【解决方案1】:

你不应该转发这个。有很多方法可以解决这个问题(例如设置FS 环境变量)。只需使用ProcessBuilder 类来传递命令行参数。

ProcessBuilder proc = new ProcessBuilder("ls", "/home/user1/My Music/song 1.mp3");
proc.start();

【讨论】:

    【解决方案2】:

    我认为引用字符串比转义字符串更简单。单引号的算法是:

    • 附加一个单引号字符以打开
    • 对于原始字符串中的每个字符,
      • 如果是单引号,则附加单引号、反斜杠、单引号、单引号(即关闭引号、附加转义单引号、重新打开引号)
      • 否则附加字符本身
    • 附加单引号字符以关闭

    所以这很容易。

    不过,我喜欢 ProcessBuilder 的答案,如果它适合你,那就更容易了。

    如果您不需要任何 shell 功能而只想生成一个进程,那么完全避免使用 shell 既能提高性能又能提高安全性。

    如果您确实想使用转义,我建议将字符列入白名单而不是列入黑名单。即逃避任何不是 [a-zA-Z0-9_] 或其他东西的东西。除换行符外,任何字符都可以转义。后跟换行符的反斜杠表示“删除反斜杠和换行符” - 如果在引号之外。在双引号内,我认为您可以使用反斜杠然后换行符来转义换行符。在单引号内,我认为您不必(或可以)转义换行符,只需附加换行符即可。

    “Shell 命令语言”http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html 的 UNIX98 规范是一个很好的参考

    【讨论】:

      【解决方案3】:

      单引号可防止外壳扩展,因此您只需要:

      def normalizePath(path: String): String = "'" + path.replace("'", "\\'") + "'"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 1970-01-01
        • 2013-11-28
        相关资源
        最近更新 更多