我有这个时髦的代码,可从命令行删除远程postgres模式:
def dropSchema = "psql --dbname=postgres://$user:$pass@localhost:$port/$targetDb -c \"DROP SCHEMA ${applicationName}_${uid} CASCADE;\"".execute()
此代码在Windows机器上运行时可以正常工作,但是在Linux发行版中时,会出现以下错误:
psql:警告:多余的命令行参数“ appName_uid”被忽略
psql:警告:多余的命令行参数“ CASCADE;”被忽略
错误:“” DROP“或附近的不加引号的标识符
第1行:“ DROP ^
有人知道如何解决此问题吗?
谢谢。
答案 0 :(得分:3)
永远不要像let arr = ["2019-07-12 12:43:00", "2019-07-09 12:57:35", "2019-07-09 12:04:33", "2019-07-05 14:32:32", "2019-07-04 17:50:23", "2019-07-02 12:12:30", "2019-07-01 18:09:28"]
let result = arr.compactMap({ $0.components(separatedBy: " ").first })
那样使用带有.execute()
的字符串。它在空白上分割,并且很可能永远不会是您想要的(对于该示例,与"ls 'my fancy file'".execute()
相同)。
还["ls", "'my", "fancy", "file'"].execute()
通过操作系统的常规.execute()
运行命令-不是外壳程序。因此,引用或其他操作,对于shell命令来说,实际上会使情况变得更糟-因为不涉及任何shell来解释您的意图。
代替使用数组,所有参数都是它们自己的数组(不要引用shell,从不使用)
exec
如果您想重用现有的shell命令,请使用shell运行它:
[
"psql",
"--dbname=postgres://$user:$pass@localhost:$port/$targetDb",
"-c", "DROP SCHEMA ${applicationName}_${uid} CASCADE;"
].execute()
在这里,您必须引用shell,因为它像shell命令一样执行。