此问题可能是特定于Windows的。我还没有在Linux或Mac上测试它。
我用:
node my-cli.js > foo.txt
:错误output is not a tty
node my-cli.js < foo.txt
:错误input is not a tty
。
答案 0 :(得分:6)
创建文件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
答案 1 :(得分:4)
之所以会发生这种情况,是因为默认设置下的Windows Git会获取此文件/etc/profile.d/aliases.sh
,该文件将执行alias node="winpty node.exe"
,这是与node
(以及其他程序,例如{ {1}},...)。因此,当您调用python
时,您的外壳实际上是在后台调用node xxx <yyy >zzz
winpty
的工作方式是使用新的隐藏控制台窗口启动winpty-agent.exe进程,该窗口在控制台API和终端输入/输出转义码之间架起了桥梁。它会轮询隐藏的控制台的屏幕缓冲区以查找更改,并生成相应的输出流。
,但是副作用是stdin和stdout无法识别为tty。
因此,在管道传输或重定向时,您将要调用winpty node xxx
二进制文件本身而不是别名。有一些方法可以做到这一点:
包装在shell脚本中,该脚本将直接调用node
,因为非交互式shell不会提供node
文件。查看其他答案(aliases.sh
和sh
都有效)
致电
bash
或
env node my-cli.js > foo.txt
command node my-cli.js > foo.txt
在默认环境中运行该命令,效果类似于上述方法;而env
是command
内置的shell,用于绕过别名。
bash
或\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
的别名,它仍指向实际的二进制文件。
扩展这些解决方案的一种方法是编写一个包装脚本,该脚本检测piping / redirection(这本身就是其他挑战),它将决定使用path/to/node
是否。
答案 2 :(得分:0)
sh -c 'node my-cli.js' > foo.txt
为我工作