执行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
相关产品推荐
相关产品推荐

