gpt4 book ai didi

node.js - 无法创建/dev/stdout : No such device or address

转载 作者:IT王子 更新时间:2023-10-29 00:38:45 26 4
gpt4 key购买 nike

我想通过 Node 运行 shell 命令并捕获标准输出的结果。我的脚本在 OSX 上运行良好,但在 Ubuntu 上运行不正常。

我已将问题和脚本简化为以下 Node 脚本:

var execSync = require('child_process').execSync,
result = execSync('echo "hello world" >> /dev/stdout');

// Do something with result

结果:

/bin/sh: 1: cannot create /dev/stdout: No such device or address

  • 我尝试用 /dev/fd/1 替换 /dev/stdout
  • 我已经尝试将 shell 更改为 bash...execSync('echo ...', {shell : '/bin/bash'})

就像我说的,上面的问题被简化了。真正的脚本接受一个参数,即应该写入结果的文件的名称,因此我需要通过提供对 stdout 流的访问作为文件描述符来解决这个问题,即 /dev/stdout

如何通过 Node 执行命令,同时让命令访问它自己的 stdout 流?

最佳答案

/dev/stdout

我无法访问 OSX 框,但来自 this issuephantomjs 上,虽然在 OSX/BSD 和 Linux 上 /dev/stdout 似乎是一个符号链接(symbolic link),但它们之间的工作方式似乎不同。其中一位评论者表示,在 OSX 上使用 /dev/stdout 是标准,但在 Linux 上则不然。在 another random place我读到的语句暗示 /dev/stdout 几乎是 OSX 的东西。可能会有线索in this answer至于为什么它在 Linux 上不起作用(以这种方式使用时似乎隐式关闭了文件描述符)。

其他相关问题:

解决方案

我在 Arch 上试过你的代码,它确实给了我同样的错误,就像提到的变体一样 - 所以这与 Ubuntu 无关。

我找到了一个 blog post它描述了如何将文件描述符传递给 execSync。把它和我从 here 得到的东西放在一起和 here , 我写了你代码的这个修改版本:

var fs = require('fs');
var path = require('path');

var fdout = fs.openSync(path.join(process.cwd(), 'stdout.txt'), 'a');
var fderr = fs.openSync(path.join(process.cwd(), 'stderr.txt'), 'a');

var execSync = require('child_process').execSync,
result = execSync('echo "hello world"', {stdio: [0,fdout,fderr] });

除非我误解了您的问题,否则您希望能够更改 execSync 中命令输出的位置。有了这个,您可以使用文件描述符。如果您希望被调用的程序输出到 stdoutstderr,您仍然可以传递它的父级,您已经在评论中提到过。

为了将来引用,这适用于内核版本 4.10.9-1-ARCHbash 4.4.12node v7.7.3.

关于node.js - 无法创建/dev/stdout : No such device or address,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40301841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com