我想通过节点运行一个shell命令并捕获stdout的结果。 我的脚本在OSX上正常工作,但不在Ubuntu上。
我已经将问题和脚本简化为以下节点脚本:
var execSync = require('child_process').execSync,result = execSync('echo "hello world" >> /dev/stdout'); // Do something with result
结果是:
/ bin / sh:1:不能创build/ dev / stdout:没有这样的设备或地址
bash陷阱和进程替代
seq使用逗号作为小数点分隔符
Unix / Linuxpipe道生产者还是消费者驱动?
如何在bash shell脚本中正确处理通配符扩展?
我试图用/dev/stdout /dev/fd/1replace/dev/stdout
我已经尝试将shell更改为bash … execSync('echo ...',{shell : '/bin/bash'})
就像我说的,上面的问题被简化了。 真正的脚本接受作为参数的结果应写入文件的名称,所以我需要通过提供对stdoutstream作为文件描述符(即/dev/stdout访问来解决此问题。
我怎样才能通过节点执行命令,同时给命令访问它自己的标准输出stream?
有没有办法在posix shell或bash中扇出一个stream?
为什么bc和args不能一起工作?
将stderrredirect到logging器,然后redirect到文件
在Windows上运行程序作为(linux风格)前台terminal进程?
在/dev/stdout
我没有访问OSX框,但是从phantomjs上的这个问题看来,尽管在OSX / BSD和Linux /dev/stdout都是符号链接,但是它们之间似乎有不同的工作方式。 其中一位评论者表示,在OSX上使用/dev/stdout但不适用于Linux。 在另一个随机的地方,我读了一些暗示/dev/stdout几乎是OSX的东西。 这个答案可能有一个线索,为什么它不能在Linux上工作(似乎用这种方式隐式关闭文件描述符)。
更多相关问题:
https://unix.stackexchange.com/questions/36403/portability-of-dev-stdout
解决方案
我在Arch上尝试了你的代码,它确实给了我同样的错误,就像提到的变体一样 – 所以这和Ubuntu没有关系。
我发现了一篇博文 ,描述了如何将文件描述符传递给execSync 。 把这些与我从这里和这里得到的一起放在一起,我写了这个代码的修改版本:
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命令的输出所在的execSync 。 有了这个,你可以使用文件描述符。 如果您希望被调用的程序输出到stdout和stderr ,您仍然可以传递1和2 ,这是由父级继承的,您已经在注释中提到了这一点。
为了将来的参考,这个工作Arch与内核版本4.10.9-1-ARCH ,在bash 4.4.12和node v7.7.3 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。