在 ASCII 中显示撇号时出错
Error displaying apostrophes in ASCII
我正在为您打开终端时制作一个自定义 zsh 主题。我不是使用 oh-my-zsh 的新手,但我是 zsh 文档的新手。
这是我遇到的问题:
wolf='
.-'''''-.
.' `.
: :
: :
: _/| :
: =/_/ :
`._/ | .'
( / ,|...-'
\_/^\/||__
_/~ `""~`"` \_
__/ -'/ `-._ `\_\__
/ /-'` `\ \ \-.\
'
print -P $wolf
当我在终端中尝试时,出现两个错误:
/Users/User/.oh-my-zsh/themes/wolf.zsh-theme:4: 没有那个文件或目录: 。 .\n : :\n : :\n : _/| :\n : =/_/ :\n
._/ |
/Users/User/.oh-my-zsh/themes/wolf.zsh-theme:31: `\n
附近的解析错误
我猜这些错误与 ASCII 艺术中的撇号有关。
这里的问题(如jdv noted in )是引用。
在zsh
中:
- 无法在单引号文本中使用单引号 (
'
)。两个单引号内的任何文本都是逐字引用的,不可能有额外的引用。单引号只能用前面的反斜杠或双引号括起来。
- 双引号(
"
)内的反引号(`
)、美元符号($
)和反斜杠(\
)需要特殊处理,需要用前面的反斜杠引用。
由于相当多的这些字符出现在您的 ASCII 艺术中,您必须确保它们都被正确引用。
此外,您使用内置 print
,默认情况下也将 \
解释为转义字符。
有两种基本解决方案:
完整引用字符串并使用 print -r
或 echo -E
打印文本。在这两种情况下,参数都会禁用转义序列处理。
实现完整引用的最简单方法可能是保留周围的单引号并将任何 '
替换为 '\''
。每次出现时,这都会关闭先前的单引号文本,添加一个带引号的单引号并开始一个新的单引号文本。然后将任何其他特殊字符括在单引号内。
wolf='
.-'\'''\'''\'''\'''\''-.
.'\'' `.
: :
: :
: _/| :
: =/_/ :
`._/ | .'\''
( / ,|...-'\''
\_/^\/||__
_/~ `""~`"` \_
__/ -'\''/ `-._ `\_\__
/ /-'\''` `\ \ \-.\
'
print -r $wolf
使用 here-document 和 cat
以避免整个引用问题:
cat <<'END'
.-'''''-.
.' `.
: :
: :
: _/| :
: =/_/ :
`._/ | .'
( / ,|...-'
\_/^\/||__
_/~ `""~`"` \_
__/ -'/ `-._ `\_\__
/ /-'` `\ \ \-.\
END
注意 'END'
周围的单引号。需要这样做才能在此处文档中禁用参数替换 ($FOO
) 和命令替换 ($(command)
或 `command`
)。
我正在为您打开终端时制作一个自定义 zsh 主题。我不是使用 oh-my-zsh 的新手,但我是 zsh 文档的新手。
这是我遇到的问题:
wolf='
.-'''''-.
.' `.
: :
: :
: _/| :
: =/_/ :
`._/ | .'
( / ,|...-'
\_/^\/||__
_/~ `""~`"` \_
__/ -'/ `-._ `\_\__
/ /-'` `\ \ \-.\
'
print -P $wolf
当我在终端中尝试时,出现两个错误:
/Users/User/.oh-my-zsh/themes/wolf.zsh-theme:4: 没有那个文件或目录: 。
.\n : :\n : :\n : _/| :\n : =/_/ :\n
._/ |/Users/User/.oh-my-zsh/themes/wolf.zsh-theme:31: `\n
附近的解析错误
我猜这些错误与 ASCII 艺术中的撇号有关。
这里的问题(如jdv noted in
在zsh
中:
- 无法在单引号文本中使用单引号 (
'
)。两个单引号内的任何文本都是逐字引用的,不可能有额外的引用。单引号只能用前面的反斜杠或双引号括起来。 - 双引号(
"
)内的反引号(`
)、美元符号($
)和反斜杠(\
)需要特殊处理,需要用前面的反斜杠引用。
由于相当多的这些字符出现在您的 ASCII 艺术中,您必须确保它们都被正确引用。
此外,您使用内置 print
,默认情况下也将 \
解释为转义字符。
有两种基本解决方案:
完整引用字符串并使用
print -r
或echo -E
打印文本。在这两种情况下,参数都会禁用转义序列处理。实现完整引用的最简单方法可能是保留周围的单引号并将任何
'
替换为'\''
。每次出现时,这都会关闭先前的单引号文本,添加一个带引号的单引号并开始一个新的单引号文本。然后将任何其他特殊字符括在单引号内。wolf=' .-'\'''\'''\'''\'''\''-. .'\'' `. : : : : : _/| : : =/_/ : `._/ | .'\'' ( / ,|...-'\'' \_/^\/||__ _/~ `""~`"` \_ __/ -'\''/ `-._ `\_\__ / /-'\''` `\ \ \-.\ ' print -r $wolf
使用 here-document 和
cat
以避免整个引用问题:cat <<'END' .-'''''-. .' `. : : : : : _/| : : =/_/ : `._/ | .' ( / ,|...-' \_/^\/||__ _/~ `""~`"` \_ __/ -'/ `-._ `\_\__ / /-'` `\ \ \-.\ END
注意
'END'
周围的单引号。需要这样做才能在此处文档中禁用参数替换 ($FOO
) 和命令替换 ($(command)
或`command`
)。