【问题标题】:Error displaying apostrophes in ASCII在 ASCII 中显示撇号时出错
【发布时间】:2017-07-17 17:48:22
【问题描述】:

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

【问题讨论】:

  • set -xset -v 是你的朋友。但几乎可以肯定,您需要转义特定于 shell 的元字符,并且您需要知道需要多少级别的转义。我不确定 Oh My Zsh 在获取启动文件时需要多少,所以不是答案。但从单级转义开始,然后看看。

标签: zsh oh-my-zsh


【解决方案1】:

这里的问题(正如his comment 中提到的jdv)是引用。

zsh:

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

由于很多此类字符出现在您的 ASCII 艺术作品中,您必须确保它们都被正确引用。

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

有两种基本的解决方案:

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

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

    wolf='               
               .-'\'''\'''\'''\'''\''-.
             .'\''         `.
            :             :
           :               :
           :      _/|      :
            :   =/_/      :
             `._/ |     .'\''
          (   /  ,|...-'\''
           \_/^\/||__
        _/~  `""~`"` \_
     __/  -'\''/  `-._ `\_\__
    /     /-'\''`  `\   \  \-.\\
    
    '
    print -r $wolf
    
  • 使用带有cathere-document 来避免整个引用问题:

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

    注意'END' 周围的单引号。为了禁用 here-document 中的参数替换($FOO)和命令替换($(command)`command`),需要执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 2020-09-18
    • 1970-01-01
    • 2019-02-17
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多