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

执行Shell脚本遇‘delimited by end-of-file (wanted `EOF')’报错求解决

问题分析与解决方法

错误原因

你遇到的警告和生成的build.sh内容异常,核心问题是here-document的结束标记EOF格式不合法。

Shell中使用<<EOF定义here-document时,要求结束的EOF必须顶格书写,不能带有任何前置的空格、制表符或其他字符。你的脚本里结束的EOF前面有缩进空格,Shell无法识别它作为结束标记,会一直读取到脚本末尾,把chmod、运行容器的命令都塞进了build.sh里,同时抛出警告提示未找到预期的EOF。

解决方法

有两种修正方式,任选其一即可:

方式1:让结束标记EOF顶格

直接删除结束EOF前的所有缩进,让它顶格书写:

sh """
#!/bin/bash
cd ${WORKSPACE}

cat << EOF > build.sh
#!/bin/bash
mkdir wsbuildlinux
cd wsbuildlinux
cmake3 ../../wiresharkbuild_linux
make
EOF

chmod 755 build.sh

# run container and build wireshark
./build-env/run-wireshark-env ./build.sh
"""

这样Shell就能正确识别EOF作为here-document的结束点,只会把make之前的内容写入build.sh。

方式2:用<<-EOF忽略制表符缩进

如果想保留脚本的缩进美观,不想让EOF顶格破坏格式,可以将<< EOF改为<<-EOF,同时确保结束的EOF前面用**制表符(Tab键)**缩进(不能用空格):

sh """
#!/bin/bash
cd ${WORKSPACE}

cat <<-EOF > build.sh
#!/bin/bash
mkdir wsbuildlinux
cd wsbuildlinux
cmake3 ../../wiresharkbuild_linux
make
	EOF  # 这里必须用Tab键缩进,不能用空格

chmod 755 build.sh

# run container and build wireshark
./build-env/run-wireshark-env ./build.sh
"""

<<-EOF会忽略结束标记前的所有制表符,既保持脚本的缩进结构,又能让Shell正确识别结束点。注意:该方法仅对制表符有效,空格缩进无法被忽略。

验证修正效果

修正后重新执行脚本,生成的build.sh应仅包含以下内容:

#!/bin/bash
mkdir wsbuildlinux
cd wsbuildlinux
cmake3 ../../wiresharkbuild_linux
make

同时不会再出现关于here-document的警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:09:22