2017-07-17 76 views
0

我正在为您打开终端时制作自定义zsh主题。我对使用oh-my-zsh并不陌生,但我对zsh文档不熟悉。在ASCII中显示撇号时出错

这里是我有什么用的问题:

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

我猜测,这些错误必须做与ASCII艺术中的撇号。

+0

'set -x'和'set -v'是你的朋友。但是,几乎可以肯定的是,您需要转义shell特定的元字符,并且您需要知道需要多少级别的转义。我不确定我的Zsh在获取启动文件时需要多少哦,所以不是答案。但从一个级别的逃跑和看到开始。 – jdv

回答

0

这里的问题(如jdvhis comment中指出)引用。

zsh

  • ,不可能使用单引号(')withing单引号的文本。两个单引号内的任何文字都是逐字记录的,不需要额外引用。单引号只能用前面的反斜杠或双引号引起来。
  • 在双引号(")反引号(`),美元符号($)和反斜线(\)经特殊处理,并且需要与前面的反斜杠引用。

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

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

有两种基本的解决方案:

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

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

    wolf='    
          .-'\'''\'''\'''\'''\''-. 
         .'\''   `. 
         :    : 
         :    : 
         :  _/|  : 
         : =/_/  : 
         `._/ |  .'\'' 
         (/,|...-'\'' 
         \_/^\/||__ 
        _/~ `""~`"` \_ 
    __/ -'\''/ `-._ `\_\__ 
    / /-'\''` `\ \ \-.\\ 
    
    ' 
    print -r $wolf 
    
  • 使用这里文档cat,以避免整个报价问题:

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

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