如何在Docker Compose中执行多行命令?sed报错排查
解决sed命令报错:unknown option to `s'
报错信息
fscrawler | sed: -e expression #2, char 31: unknown option to `s'
原执行命令
command: > sh -c "sed -i -e "s/{ELASTIC_PASSWORD}/${ELASTIC_PASSWORD}/g" -e "s/{ELASTICSEARCH_HOST}/${ELASTICSEARCH_HOST}/g" -e "s/{FSCRAWLER_HOST}/${FSCRAWLER_HOST}/g" /root/.fscrawler/job1/_settings.yaml && fscrawler job1 --restart --rest"
问题根源
- 引号嵌套解析错误:
sh -c后的命令用双引号包裹,内部sed的替换命令又用双引号,shell会提前拆分引号,导致sed表达式被截断,无法正确识别。 - 分隔符冲突:sed默认用
/作为替换分隔符,如果${ELASTIC_PASSWORD}等变量值中包含/(比如密码带斜杠),会破坏sed的表达式结构,触发未知选项错误。
修复方案
方案1:替换sed分隔符+修正引号嵌套
改用#作为sed的分隔符(选变量值中大概率不会出现的字符),同时用单引号包裹sh -c的整体命令,避免引号解析混乱:
command: > sh -c 'sed -i -e "s#{ELASTIC_PASSWORD}#${ELASTIC_PASSWORD}#g" -e "s#{ELASTICSEARCH_HOST}#${ELASTICSEARCH_HOST}#g" -e "s#{FSCRAWLER_HOST}#${FSCRAWLER_HOST}#g" /root/.fscrawler/job1/_settings.yaml && fscrawler job1 --restart --rest'
方案2:调整引号拼接方式(适用于变量不含斜杠的场景)
如果确定变量值里没有/,可以保留/作为分隔符,通过拆分引号来正确传递变量:
command: > sh -c "sed -i -e 's/{ELASTIC_PASSWORD}/'"${ELASTIC_PASSWORD}"'/g' -e 's/{ELASTICSEARCH_HOST}/'"${ELASTICSEARCH_HOST}"'/g' -e 's/{FSCRAWLER_HOST}/'"${FSCRAWLER_HOST}"'/g' /root/.fscrawler/job1/_settings.yaml && fscrawler job1 --restart --rest"
核心提示
优先选方案1,因为密码、主机地址这类变量很可能包含特殊字符,换分隔符能从根源避免冲突,稳定性更高。
内容的提问来源于stack exchange,提问作者M. Mariscal
相关产品推荐
相关产品推荐

