如何在Windows的Git Bash终端中发送EOF以关闭stdin?Ctrl-D无效。

14
我正在编写一个命令行工具。其中一个功能(当然不是唯一的)是可以从stdin读取输入。我测试时通过手动输入来进行交互(而不是使用cat命令),但当我注意到我不知道如何向它发送EOF时,我陷入了困境。
今晚我花费了很多时间在谷歌上搜索,但没有找到有用的信息。 我也在Stack Overflow上搜索过。如果有重复的问题,请随时指出,但我保证我已经尽力了。
编辑:可能有用(?)的是,我在Windows上进行这个操作。所以我相信终端基本上是一个品牌化的MinGW?
5个回答

8
如果你想在Windows下向程序输入发送EOF,那么你需要使用Ctrl-Z

4
我尝试了那个方法,但是屏幕上实际打印出"^Z"让我感到困惑。 Ctrl-C可以终止进程却不打印任何东西,所以我认为它没有起作用。 然而,在执行Ctrl-Z <Enter>后,它起作用了。对于那些在我之后使用此方法的人,请注意:似乎无法在一行的末尾使用该方法。它需要单独占一行。谢谢,@Brendan。 - burfl
2
我不小心只启动了“pv”,然后在按下“Ctrl-Z”时,它只打印了“87891708 [sig] bash 2363! sigpacket :: process:抑制信号18以针对win32进程(pid 0)”。我该怎么退出? - Felix Dombek
截至2021年,在Git Bash中执行(正如OP在标题中指定的那样),这会产生警告1 [sig] bash 804!sigpacket :: process:抑制信号18以win32进程(pid 2032) - Josiah Yoder
1
只需执行 some-prog,然后尝试此操作,似乎会生成“抑制信号18以win32进程”警告,但是在Git Bash Windows 10中使用 cat | some-prog 似乎效果更好,然后正常的Ctrl-D似乎可以关闭stdin。来自 https://dev59.com/eGUo5IYBdhLWcg3w5i5M#70293204 - thepudds

6
在Windows的Git Bash中,我正在使用一个简单的解决方法来cat程序输入。例如,不是运行:
java my_package.Main

您可以运行

cat | java my_package.Main

这是因为cat程序是一个类Unix程序,可以接受终端发送的消息结束符,并且Java能够通过管道正确接收结束命令。
因此,在使用此命令时,您可以在输入消息后键入Ctrl-D,Java程序将正确看到消息的结束。

就我个人而言,这也适用于在Git Bash下运行的Windows 10上的Go程序。 - thepudds

3

这是^D,ASCII传输结束字符。所有GNU用户工具都将遵循POSIX标准。


这在Windows上也是这样吗?我刚试着向GnuWin32的cat命令发送^D,但它没有做任何事情。 ^Z像预期的那样退出了cat。 - Brendan Dolan-Gavitt
2
^D没有起作用。程序读取并将其解释为文字"^D"。 - burfl
这是Ctrl-D,而不是两个字符的插入符-d序列。我经常在Windows上使用git bash,所以我已经知道了它,我在回答之前在shell中测试了它,只是因为我碰巧此时在Windows上,并且我现在用cat再次尝试了一下。我能说的就是,“对我来说有效”。很抱歉我没有更好的解释。 - jthill
行为可能会因程序而异。根据 https://dev59.com/eGUo5IYBdhLWcg3w5i5M#59686569 的说法,“cat”似乎比Java或Go程序表现更好。 - thepudds

0
"

”^d ^d” 对我有效。只需将此字符串添加到输入的末尾即可成功。

"

解释为什么这个答案是正确的会很有用。 - Alexey Novakov

0
在Windows中,使用winpty前缀来启用TTY功能,然后执行登录命令。
winpty docker login -u <username>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接