执行psql填充Postgres数据库提示stdin is not a tty怎么办
问题说明
执行Postgres数据库导入命令时收到stdin is not a tty提示,执行的命令为:
psql -U postgres kdc < kdc.psql
命令中kdc为目标数据库名称,kdc.psql为存储导入逻辑的SQL脚本,执行命令时的工作目录就是脚本所在目录。
原因说明
这个提示不是致命错误:psql启动时会默认检测当前标准输入是否连接到交互终端(tty),当你用<做shell重定向、把文件内容作为输入传给psql时,输入源是文件而非交互终端,就会抛出这个提示。
如果命令执行完没有抛出其他SQL语法、权限相关的报错,数据会正常导入到目标库,这个提示可以直接忽略。如果提示出现后导入流程直接中断,可参考下面的方案调整。
解决方法
- 优先使用psql原生的文件读取参数执行脚本,完全绕开stdin重定向的检测逻辑,也是官方推荐的脚本执行方式:
参数说明:psql -U postgres -d kdc -f kdc.psql-d显式指定目标数据库,-f指定要执行的SQL脚本路径,执行过程不会触发tty相关检测。 - 如果需要保留重定向的写法,可以加参数强制psql进入纯非交互模式,跳过终端检测:
参数说明:psql -U postgres kdc --no-psqlrc -q < kdc.psql--no-psqlrc跳过加载用户自定义的交互配置文件,-q开启静默模式,关闭所有交互相关的逻辑判断。 - 如果你是在
docker exec、ssh、sudo这类嵌套命令场景下执行的导入,需要给外层命令加关闭tty分配的参数:比如docker exec去掉-t只保留-i,ssh加-T参数禁止分配伪终端即可。
内容的提问来源于stack exchange,提问作者Sam George
相关产品推荐
相关产品推荐

