作为练习,我尝试使用 node.js 中的系统调用将一个小文本文件写入/tmp 目录。这是我的代码:
#!/bin/node
var child_process = require("child_process");
var send = "Hello, world!";
child_process.exec('cat - > /tmp/test1', { input: send });
文件实际上被创建了;但是,其中没有放置任何内容。事情就这么悬着。有人可以告诉我我错过了什么吗?
另外,我真的很想知道如何同步执行此操作。
感谢您的任何意见。
... doug
最佳答案
嗯,除非我也忘记了 rtm,否则这段代码永远不会工作。 cp.exec 没有这样的输入选项。
但是有一个 stdio 选项,可以让我们在子进程上打开预期的 stdio。
child_process.exec('cat - > /tmp/test1', { stdio: 'pipe' });
参见https://nodejs.org/api/child_process.html#child_process_options_stdio
stdio
不是字符串,它们是流,我们可以结束/写入/管道/关闭/推送等
参见https://nodejs.org/api/stream.html
请注意,stdin 是可写的,stdout/stderr 是可读的。
要编写 cat
的标准输入,您现在将使用 cp.stdin 对象并调用其 end() 方法。
child_process.exec('cat - > /tmp/test1', { stdio: 'pipe' }).stdin.end('hello world');
请注意,end 方法是写入后终止流,这是告诉 cat 退出所必需的。
为了确保其正常工作,我们应该重构它,不要将 stdin 发送到文件,而是通过管道将 child.stdout 发送到 process.stdout。
var child_process = require('child_process');
var cp = child_process.exec('cat -', { stdio: 'pipe' });
cp.stdin.end('hello world');
cp.stdout.pipe(process.stderr);
请注意,该进程是全局的。
关于node.js:使用系统调用将文件写入/tmp 目录时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37106026/