为什么zsh中执行`python -c 'print('howdy')'`报错但双引号版本正常?
核心原因
这个差异和Python本身的单双引号使用规则无关,是zsh的命令行字符串解析逻辑提前处理了输入的引号,导致最终传给Python的代码和你预期的不一致。
报错命令解析过程
你执行的python -c 'print('howdy')'会被zsh按如下规则拆解:
- zsh中,单引号包裹的字符串不支持内部转义单引号,遇到未转义的单引号就会直接终止当前字符串段
- 你的命令会被拆为3个独立的字符串段:
- 开头的
'print('解析后得到纯文本print( - 中间无任何引号包裹的
howdy直接作为普通文本保留 - 末尾的
')'解析后得到纯文本)
- 开头的
- 三段拼接后最终传给Python执行的代码是
print(howdy),此时howdy在Python中被识别为未定义的变量名,因此抛出NameError。
正常执行命令的原理
你执行的python -c 'print("howdy")'中,双引号被包裹在外层的单引号内部:
- zsh中,单引号包裹的字符串里,双引号没有特殊语义,不会终止外层的单引号段
- 因此zsh会直接把完整的
print("howdy")传给Python,Python识别到双引号包裹的howdy是字符串常量,因此正常输出。
扩展方案
如果你确实需要在Python代码里用单引号包裹字符串,可以用'\''的特殊写法在zsh的单引号段里插入单引号,示例如下:
python -c 'print('\''howdy'\'')'
内容的提问来源于stack exchange,提问作者TransferOrbit
相关产品推荐
相关产品推荐

