代码之家  ›  专栏  ›  技术社区  ›  Marco Eckstein

Bash+节点。js+stdin/stdout重定向:错误“不是tty”

  •  7
  • Marco Eckstein  · 技术社区  · 7 年前

    我使用:

    • 节点。js 8.1.3
    • Git for Windows 2.8.1,包括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 .

    4 回复  |  直到 7 年前
        1
  •  9
  •   Marco Eckstein    7 年前

    创建文件 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

        2
  •  9
  •   Phu Ngo    4 年前

    这是因为默认安装下的Git for Windows将获取此文件 /etc/profile.d/aliases.sh alias node="winpty node.exe" node python ,...). 所以当你调用 node xxx <yyy >zzz winpty node xxx

    winpty

    ,但副作用是标准输入法和标准输出法不被视为tty。

    节点 二进制本身而不是别名。有一些方法可以实现这一点:

    1. 封装在shell脚本中,该脚本将直接调用 由于非交互式shell不提供 aliases.sh sh bash

    2. 呼叫
      env node my-cli.js > foo.txt
      command node my-cli.js > foo.txt

    env command 是一个

    1. 呼叫方式
      \node my-cli.js > foo.txt
      'node' my-cli.js > foo.txt
      "node" my-cli.js > foo.txt

    1. 使用呼叫
      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.exe 也没有 path/to/node ,它仍然指向实际的二进制。

    扩展这些解决方案的一种方法是编写一个包装器脚本来检测 piping / redirection 温普蒂

        3
  •  2
  •   Laura    3 年前

    由于2022年我在GitBash遇到了同样的问题,其他答案之一为我指出了最简单的解决方案。

    node my-cli.js > foo.txt

    你需要做的就是改变 node node.exe 其他一切都保持不变。

    node.exe my-cli.js > foo.txt

    别名,但 没有别名,因此它按您希望的方式工作。

        4
  •  1
  •   Konstantin Pelepelin    6 年前

    sh -c 'node my-cli.js' > foo.txt 适合我