scala.sys.process执行csvsql命令失败:rfc1738 URL解析错误
问题核心原因
scala.sys.process的命令执行逻辑和系统shell的参数解析规则存在本质差异:
shell执行命令时会自动识别字符串前后的双引号,剥离引号后把包裹的完整内容作为单参数传递给程序;但scala.sys.process执行整串命令时,是直接按空格拆分参数,不会对字符串内嵌的双引号做剥离、转义处理,相当于把带双引号的连接串整体作为--db参数值传给了csvsql。csvsql实际拿到的连接串值是前后带双引号字符的"postgresql://user:password@localhost:5432/samples",不符合rfc1738的URL格式要求,最终触发解析报错。
修正方案
- 方案1:如果数据库连接串中没有空格等需要做参数边界分隔的特殊字符,直接删除命令字符串里包裹连接串的双引号即可,修正后的代码为:
s"""csvsql --db postgresql://user:password@localhost:5432/samples --table sample_table --insert /absolute.path.csv""" !!
- 方案2:如果参数中存在空格、特殊字符,为了避免整串字符串拼接带来的参数拆分歧义,使用参数列表的方式传参。这是
scala.sys.process执行外部命令的推荐写法,可自动处理参数边界问题,无需手动加引号做分隔,示例代码为:
import scala.sys.process._ Seq( "csvsql", "--db", "postgresql://user:password@localhost:5432/samples", "--table", "sample_table", "--insert", "/absolute.path.csv" ) !!
注意:不要直接套用shell的引号规则写
scala.sys.process的整串执行逻辑,两种环境的参数解析机制完全不兼容。
内容的提问来源于stack exchange,提问作者senjin.hajrulahovic
相关产品推荐
相关产品推荐

