为什么subprocess调用shell脚本时返回的转义字符多一个反斜杠?
问题原因分析
这个差异本质是两个场景下实际传给echo命令的输入内容、调用的echo实现版本两个因素共同导致的,具体拆分如下:
1. 直接通过subprocess执行命令的场景
你在Python中定义的命令字符串cmd='echo -n "1\n2"'里,\n属于Python字符串的转义字符,Python会先把这个字符串里的\n解析成ASCII换行符,再把整个命令传给shell执行。
相当于你实际在shell里执行的命令是:
echo -n "1 2"
echo直接输出包含换行符的内容,因此Python读取到的结果里是实际的换行符,在Python的字符串repr表现中就是'1\n2'。
2. 调用shell脚本执行的场景
你写在test.sh里的echo -n "1\n2",此处的\n是shell脚本里的字面量,不会被shell提前解析为换行符:
- 你调用的是
sh test.sh,sh遵循POSIX标准,其内置的echo命令默认不会解析反斜杠开头的转义序列,会直接把\和n作为两个独立字符输出 - 因此Python读取到的内容实际是
\+n两个字符,在Python的字符串repr表现中,反斜杠需要转义,所以显示为'1\\n2',\t的情况逻辑完全一致。
修复方案
如果要让shell脚本里的echo输出转义后的特殊字符,可以给echo加上-e参数(主动开启转义解析),修改test.sh内容如下:
#!/bin/bash echo -en "1\n2"
也可以改用兼容性更强的printf命令,规避不同shell下echo实现的差异:
#!/bin/bash printf "1\n2"
内容的提问来源于stack exchange,提问作者user7528444
相关产品推荐
相关产品推荐

