On /dev/stdout
我无法访问 OSX 盒子,但是从这个问题 on phantomjs
,似乎在 OSX/BSD 和 Linux 上/dev/stdout
是一个符号链接,尽管如此,它们之间的工作方式似乎有所不同。一位评论者表示这是 OSX 上使用的标准/dev/stdout
但不适用于Linux。在另一个随机的地方我读到的陈述暗示/dev/stdout
几乎是 OSX 的事情。或许有线索在这个答案中至于为什么它在Linux上不起作用(似乎以这种方式使用时隐式关闭文件描述符)。
更多相关问题:
- https://unix.stackexchange.com/questions/36403/portability-of-dev-stdout
- bash 重定向到 /dev/stdout:不是目录
解决方案
我在 Arch 上尝试了你的代码,它确实给了我同样的错误,就像提到的变体一样 - 所以这与 Ubuntu 无关。
我找到了一个博客文章描述了如何将文件描述符传递给execSync
。将其与我从中得到的内容结合起来here and 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
去。有了这个,您可以使用文件描述符。你仍然可以通过1
and 2
如果你想让被调用的程序输出到stdout
and stderr
由其父级继承,您已经在评论中提到过。
为了将来的参考,这适用于带有内核版本的 Arch4.10.9-1-ARCH
, on bash 4.4.12
and node v7.7.3
.