psql中执行带变量插值的shell命令的更简便方法
在psql中执行带变量插值的shell命令
问题说明
想要在psql中执行包含psql变量插值的shell命令,例如:
postgres=> \! pg_dump -Fc -d :source_db | pg_restore -d :dest_db
但psql官方文档明确指出这种方式无法实现:
该行剩余的全部内容始终被视为!的参数,参数中不执行变量插值或反引号展开。
已找到两种解决方法,但操作较为繁琐,现询问是否存在更优方案,以及是否有类似\!且支持变量插值的元命令的功能需求。
已有的解决方法
方法1:通过SQL构建命令并传递给bash
利用SQL拼接命令字符串,再通过\g输出结果并管道给bash执行:postgres=> SELECT 'pg_dump -Fc -d ' || :'source_db' || ' | pg_restore -d ' || :'dest_db' \g (tuples_only=on) | bash方法2:通过
\setenv将变量转为环境变量
先把psql变量赋值给环境变量,再在shell命令中引用环境变量:postgres=> \setenv SOURCE_DB :source_db postgres=> \setenv DEST_DB :dest_db postgres=> \! pg_dump -Fc -d $SOURCE_DB | pg_restore -d $DEST_DB
更优方案与功能需求
目前psql原生没有提供直接支持变量插值的\!替代元命令,但可以通过以下方式简化操作:
postgres=> \set cmd 'pg_dump -Fc -d ' :'source_db' ' | pg_restore -d ' :'dest_db' postgres=> \! echo :'cmd' | bash
这种方式通过\set直接拼接生成shell命令字符串,无需SQL查询或设置环境变量,步骤更简洁。
另外,社区中确实存在对支持变量插值的shell执行元命令的需求,不少用户希望psql增强\!的功能或新增同类元命令来支持变量替换,但截至目前该功能尚未被官方纳入。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

