在ASCII中显示撇号时出错

时间:2017-07-17 17:48:22

标签: zsh oh-my-zsh

我在打开您的终端时制作自定义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艺术中的撇号有关。

1 个答案:

答案 0 :(得分:0)

此处的问题(jdv中注明为his comment)引用。

zsh

  • 无法使用带单引号文本的单引号(')。两个单引号内的任何文本都是逐字记录的,不能进行额外的引用。单引号只能用前面的反斜杠或双引号引用。
  • 在双引号(")反引号(`)中,美元符号($)和反斜杠(\)会被特别处理,需要引用带有前面的反斜杠。

由于你的ASCII艺术中出现了很多这些字符,你必须确保它们都被正确引用。

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

有两种基本解决方案:

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

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

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

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

    请注意'END'周围的单引号。这需要完成,以便在here-document中禁用参数替换($FOO)和命令替换($(command)`command`)。