Bash + Node.js + stdin / stdout重定向:错误"不是tty"

时间:2017-07-14 23:26:20

标签: node.js stdout stdin git-bash mingw-w64

此问题可能是特定于Windows的。我还没有在Linux或Mac上测试它。

我用:

  • Windows 7 64位
  • Node.js 8.1.3
  • Git for Windows 2.8.1,包括GNU bash,版本4.3.42(5)-release

node my-cli.js > foo.txt:错误output is not a tty

node my-cli.js < foo.txt:错误input is not a tty

3 个答案:

答案 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二进制文件本身而不是别名。有一些方法可以做到这一点:

  1. 包装在shell脚本中,该脚本将直接调用node,因为非交互式shell不会提供node文件。查看其他答案(aliases.shsh都有效)

  2. 致电
    bash
    env node my-cli.js > foo.txt

command node my-cli.js > foo.txt在默认环境中运行该命令,效果类似于上述方法;而envcommand内置的shell,用于绕过别名。

  1. 打个电话
    bash
    \node my-cli.js > foo.txt
    'node' my-cli.js > foo.txt

反斜杠和引号是显式绕过别名的结构。

  1. 使用
    拨打电话 "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的别名,不是nodenode.exe的别名,它仍指向实际的二进制文件。

扩展这些解决方案的一种方法是编写一个包装脚本,该脚本检测piping / redirection(这本身就是其他挑战),它将决定使用path/to/node是否。

答案 2 :(得分:0)

sh -c 'node my-cli.js' > foo.txt为我工作