You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:09:02