在 ASCII 中显示撇号时出错

Error displaying apostrophes in ASCII

我正在为您打开终端时制作一个自定义 zsh 主题。我不是使用 oh-my-zsh 的新手,但我是 zsh 文档的新手。

这是我遇到的问题:

wolf='               
           .-'''''-.
         .'         `.
        :             :
       :               :
       :      _/|      :
        :   =/_/      :
         `._/ |     .'
      (   /  ,|...-'
       \_/^\/||__
    _/~  `""~`"` \_
 __/  -'/  `-._ `\_\__
/     /-'`  `\   \  \-.\

'


print -P $wolf

当我在终端中尝试时,出现两个错误:

  1. /Users/User/.oh-my-zsh/themes/wolf.zsh-theme:4: 没有那个文件或目录: 。 .\n : :\n : :\n : _/| :\n : =/_/ :\n._/ |

  2. /Users/User/.oh-my-zsh/themes/wolf.zsh-theme:31: `\n

  3. 附近的解析错误

我猜这些错误与 ASCII 艺术中的撇号有关。

这里的问题(如jdv noted in )是引用。

zsh中:

  • 无法在单引号文本中使用单引号 (')。两个单引号内的任何文本都是逐字引用的,不可能有额外的引用。单引号只能用前面的反斜杠或双引号括起来。
  • 双引号(")内的反引号(`)、美元符号($)和反斜杠(\)需要特殊处理,需要用前面的反斜杠引用。

由于相当多的这些字符出现在您的 ASCII 艺术中,您必须确保它们都被正确引用。

此外,您使用内置 print,默认情况下也将 \ 解释为转义字符。

有两种基本解决方案:

  • 完整引用字符串并使用 print -recho -E 打印文本。在这两种情况下,参数都会禁用转义序列处理。

    实现完整引用的最简单方法可能是保留周围的单引号并将任何 ' 替换为 '\''。每次出现时,这都会关闭先前的单引号文本,添加一个带引号的单引号并开始一个新的单引号文本。然后将任何其他特殊字符括在单引号内。

    wolf='               
               .-'\'''\'''\'''\'''\''-.
             .'\''         `.
            :             :
           :               :
           :      _/|      :
            :   =/_/      :
             `._/ |     .'\''
          (   /  ,|...-'\''
           \_/^\/||__
        _/~  `""~`"` \_
     __/  -'\''/  `-._ `\_\__
    /     /-'\''`  `\   \  \-.\
    
    '
    print -r $wolf
    
  • 使用 here-documentcat 以避免整个引用问题:

    cat <<'END'
               .-'''''-.
             .'         `.
            :             :
           :               :
           :      _/|      :
            :   =/_/      :
             `._/ |     .'
          (   /  ,|...-'
           \_/^\/||__
        _/~  `""~`"` \_
     __/  -'/  `-._ `\_\__
    /     /-'`  `\   \  \-.\
    
    END
    

    注意 'END' 周围的单引号。需要这样做才能在此处文档中禁用参数替换 ($FOO) 和命令替换 ($(command)`command`)。