如何在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
相关产品推荐
相关产品推荐

