我试图从 Git Bash 环境中备份数据库,但可执行文件没有输出任何内容。
如果我使用-f
标志指定文件名,则会创建一个空白文件,因此可执行文件显然会运行,但它不执行任何操作 - 没有输出或活动。使用该-v
标志也不会使其产生任何输出。
如果我运行pg_dump --help
,我会得到输出。
当我从 Windows 命令行执行相同操作时,我被要求输入密码并且转储进行得很好。
pg_dump
在那里不工作的 Git Bash 环境有什么不同?有什么解决方法吗?如果可能的话,我宁愿远离 Windows 命令行。
我怀疑在 Git Bash 环境中它也在等待密码,但您没有看到它的提示(是否可以将它提示的 stdout/stderr 重定向到终端以外的其他地方?)。
尝试输入密码,就像收到提示一样,看看会发生什么。此外,请尝试通过其他方式提供密码(如此处所述)。在任何一种情况下,这可能都不是一个
pg_dump
特定的问题,而是一个 bash/bashgit/windows/other 影响需要类似输入的其他工具的问题,您更有可能在其他地方获得有用的答案。TLDR:代替
pg_dump ...
, 使用winpty pg_dump ...
Git Bash 的不同之处在于它是一个在
mintty
不支持 Windows Terminal API 的窗口中运行的 POSIX 程序(除非您启用了某个可选的并且仍然不是生产就绪功能)。失败最常见于尝试使用该 API 读取密码而不在用户键入密码时打印的程序。您的版本
pg_dump
可能已编译为使用 Windows 终端 API,以便它可以读取密码而不回显它。(如果它是用 POSIX API 编译的,在 Windows 终端中运行时不显示密码的尝试会失败。)如果你在mintty
with中运行它,winpty
你可能会看到密码提示并且能够输入密码。winpty
是一个 shim,它启动一个隐藏的 Windows 控制台窗口,运行你给它的程序连接到 I/O,然后轮询该控制台的屏幕以将输出发送回你的 MinGW 终端。