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

如何在Fish脚本中嵌入Python代码?解决EOF适配问题

Bash转Fish脚本:解决Here Document与特殊字符转义问题

问题背景

我正在将一段Bash脚本转换为Fish脚本,原Bash代码通过Here Document捕获Python代码模板,再用sed注入实际Python代码后执行:

PYCODE=$(cat << EOF
#INSERT_PYTHON_CODE_HERE
EOF
)

RESPONSE=$(COLUMNS=999 /usr/bin/env python3 -c "$PYCODE" $@)

我尝试的Fish写法如下,但当Python代码同时包含单引号'和双引号"时会失效:

set PYCODE "
#INSERT_PYTHON_CODE_HERE
"

set RESPONSE (COLUMNS=999 /usr/bin/env python3 -c "$PYCODE" $argv)

同时希望尽量保留原sed注入逻辑:

set FISH_SCRIPT (sed -e "/#INSERT_PYTHON_CODE_HERE/r $BASE_DIR/test_sh.py" $BASE_DIR/../src/mfa.fish)

解决方案

1. 正确模拟Bash的Here Document

Fish中可以用read -z结合单引号包裹的终止符,实现和Bash <<'EOF'完全一致的效果——原样保留所有内容,不做任何转义或变量替换:

read -z PYCODE << 'EOF'
#INSERT_PYTHON_CODE_HERE
EOF

这种写法会完整捕获多行文本,包括所有特殊字符、引号和换行,彻底避免转义问题。

2. 执行Python代码的正确方式

获取PYCODE后,执行时直接传递变量即可,Fish会自动处理包含特殊字符的参数传递,不需要额外添加引号:

set RESPONSE (COLUMNS=999 /usr/bin/env python3 -c $PYCODE $argv)

3. 保留原有sed注入逻辑

你的sed命令无需修改,它会将外部Python文件内容追加到#INSERT_PYTHON_CODE_HERE行后,配合上面的read逻辑,注入后的Fish脚本可以正确识别完整的Python代码,不会因引号问题报错。

内容的提问来源于stack exchange,提问作者flybonzai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:31:03