使用 psql,我可以从命令行覆盖 .psqlrc 中设置的变量吗?
using psql, can I override variables set in .psqlrc from command line?
我想要一个具有默认值的 .psqlrc
文件,并且能够从 psql
的命令行覆盖这些值。
例如:
- 在
.psqlrc
中设置了一些值:
-- .psqlrc :
-- "user@database # " in bold green
\set PROMPT1 '%[%033[1;32;40m%]%n@%/%[%033[0m%]% > '
-- store command history in home directory, with a per database file :
\set HISTFILE ~/.psql-history- :DBNAME
- 在一些包装脚本
master-psql.sh
中,它以用户 postgres
的身份连接,能够覆盖这些值:
# master-psql.sh :
# when using this script, change color to red, change history file location :
psql -U postgres \
-v PROMPT1='%[%033[1;31;40m%]%n@%/%[%033[0m%]% # ' \
-v HISTFILE='/some/other/place/.psql_history_postgres'
以上不起作用,因为 -v ...
参数在 之前执行 .psqlrc
文件被加载,并且 [=12] 中的指令=] 覆盖现有值。
问题
有没有办法指示 psql
运行 一组命令 在 加载其 .psqlrc
文件后,
或者让 .psqlrc
仅在未设置值时执行一些 \set
或 \pset
命令?
如果已经设置到 .psqlrc
文件本身,您可以编写不覆盖这些变量的说明:
\if :{?HISTFILE}
\else
\set HISTFILE ~/.psql-history- :DBNAME
\endif
如果你不能让你的系统psqlrc配合你,那么可能需要复制修改然后绕过原来的。 :{?
构造至少需要 v11。
问题是即使没有 RC 文件处理,PROMPT1 也有一个内置的默认值,因此您可能需要针对内置的字符串测试它,而不是测试是否被定义。所以我认为最终会是这样的:
select :'PROMPT1'='%/%R%x%# ' as default_prompt \gset
\if :default_prompt
\set PROMPT1 '%[%033[1;32;40m%]%n@%/%[%033[0m%]% > '
\endif
请注意,默认编译在 v13 中发生了变化,因此如果您也想使用旧版本,则需要做一些更复杂的事情。
从这里开始:
https://www.postgresql.org/docs/current/app-psql.html
Environment
[...]
PSQLRC
Alternative location of the user's .psqlrc file. Tilde (~) expansion is performed.
因此,创建一个备用 .psqlrc
文件并为脚本设置 PSQLRC
环境变量以覆盖您的默认值。
我想要一个具有默认值的 .psqlrc
文件,并且能够从 psql
的命令行覆盖这些值。
例如:
- 在
.psqlrc
中设置了一些值:
-- .psqlrc :
-- "user@database # " in bold green
\set PROMPT1 '%[%033[1;32;40m%]%n@%/%[%033[0m%]% > '
-- store command history in home directory, with a per database file :
\set HISTFILE ~/.psql-history- :DBNAME
- 在一些包装脚本
master-psql.sh
中,它以用户postgres
的身份连接,能够覆盖这些值:
# master-psql.sh :
# when using this script, change color to red, change history file location :
psql -U postgres \
-v PROMPT1='%[%033[1;31;40m%]%n@%/%[%033[0m%]% # ' \
-v HISTFILE='/some/other/place/.psql_history_postgres'
以上不起作用,因为 -v ...
参数在 之前执行 .psqlrc
文件被加载,并且 [=12] 中的指令=] 覆盖现有值。
问题
有没有办法指示 psql
运行 一组命令 在 加载其 .psqlrc
文件后,
或者让 .psqlrc
仅在未设置值时执行一些 \set
或 \pset
命令?
如果已经设置到 .psqlrc
文件本身,您可以编写不覆盖这些变量的说明:
\if :{?HISTFILE}
\else
\set HISTFILE ~/.psql-history- :DBNAME
\endif
如果你不能让你的系统psqlrc配合你,那么可能需要复制修改然后绕过原来的。 :{?
构造至少需要 v11。
问题是即使没有 RC 文件处理,PROMPT1 也有一个内置的默认值,因此您可能需要针对内置的字符串测试它,而不是测试是否被定义。所以我认为最终会是这样的:
select :'PROMPT1'='%/%R%x%# ' as default_prompt \gset
\if :default_prompt
\set PROMPT1 '%[%033[1;32;40m%]%n@%/%[%033[0m%]% > '
\endif
请注意,默认编译在 v13 中发生了变化,因此如果您也想使用旧版本,则需要做一些更复杂的事情。
从这里开始:
https://www.postgresql.org/docs/current/app-psql.html
Environment
[...]PSQLRC
Alternative location of the user's .psqlrc file. Tilde (~) expansion is performed.
因此,创建一个备用 .psqlrc
文件并为脚本设置 PSQLRC
环境变量以覆盖您的默认值。