此问题可能是特定于Windows的。我还没有在Linux或Mac上测试过它。
我使用:
- 视窗 7 64 位
- 节点.js 8.1.3
- 适用于 Windows 2.8.1 的 Git,包括 GNU bash,版本 4.3.42(5)-发行版
node my-cli.js > foo.txt
:错误output is not a tty
node my-cli.js < foo.txt
:错误input is not a tty
。
发生这种情况是因为默认设置上的 Windows Git 将获取此文件/etc/profile.d/aliases.sh
该文件,该文件将执行alias node="winpty node.exe"
,这是与node
(以及其他程序,如python
,...)进行交互使用所必需的。所以当你调用node xxx <yyy >zzz
时,你的 shell 实际上是在引擎盖下调用winpty node xxx
winpty
的工作原理是使用新的隐藏控制台窗口启动 winpty-agent.exe 进程,该窗口在控制台 API 和终端输入/输出转义代码之间架起桥梁。它会轮询隐藏控制台的屏幕缓冲区以查找更改,并生成相应的输出流。
,但副作用是标准输入和标准输出不被识别为 TTY。
因此,在管道或重定向时,您可能希望调用node
二进制文件本身,而不是别名。有一些方法可以实现此目的:
-
包装一个直接调用
node
的 shell 脚本,因为非交互式 shell 不会获取aliases.sh
文件。查看其他答案(sh
和bash
工作) -
与
env node my-cli.js > foo.txt
或command node my-cli.js > foo.txt
通话
env
默认环境中运行命令,效果与上述方法类似;而command
是内置的bash
shell,用于绕过别名。
- 像
node my-cli.js > foo.txt
或'node' my-cli.js > foo.txt
或"node" my-cli.js > foo.txt
一样
调用
反斜杠和引号是显式绕过别名的构造。
- 使用
node.exe my-cli.js > foo.txt
或/full/path/to/node my-cli.js > foo.txt
或relative/path/to/node my-cli.js > foo.txt
调用
别名是node
的,不是node.exe
也不是path/to/node
,它仍然指向实际的二进制。
扩展这些解决方案的一种方法是编写一个包装脚本来检测管道/重定向(这本身就是另一个挑战tbh),它将决定是否使用winpty
。
创建一个文件my-cli
:
#!/bin/sh
node "path/to/my-cli.js" "$@"
exit $?
拨打./my-cli > foo.txt
或./my-cli < foo.txt
。
这也适用于参数:./my-cli --answer 42 > foo.txt
由于我在 2022 年在这里在 GitBash 中遇到了同样的问题,因此其他答案之一为我指出了最简单的解决方案。
由于您已经在输入
node my-cli.js > foo.txt
您需要做的就是将node
更改为node.exe
,并使其他一切都保持不变。
node.exe my-cli.js > foo.txt
上面的别名答案是让我尝试这个的原因。node
已设置别名,但node.exe
没有别名,因此它可以按照您希望的方式工作。
sh -c 'node my-cli.js' > foo.txt
对我有用