我正在编写一个cli in节点,我想打开用户$ EDITOR来编辑从流(http响应IncomingMessage)中读取的数据。
如何将数据发送到文件描述符?
在bash中,我可以这样写:
$EDITOR <(curl $url)
<(curl $url)
扩展为类似/proc/self/fd/11
echo <(curl $url)
/proc/self/fd/11
但是我怎么用javascript编写呢?
import cp from 'child_process'
const stream = request(...);
const fd = ???;
const proc = cp.spawn(process.env.EDITOR, [fd] { stdio: 'inherit' });
好吧,如果stream
由套接字或fd支持,则可以将其传递给options.stdio
,但是如果不是,怎么办呢,如果它是转换流呢?
options.stdio 对象-与子进程共享一个引用tty,文件,套接字或管道的可读或可写流。流的基础文件描述符在子进程中复制到与stdio数组中的索引对应的fd中。该流必须具有基础描述符(文件流只有在'open'事件发生之前才可以)。
是的,我可以创建一个临时文件,但没有一个可以做吗?
答案 0 :(得分:1)
您可以使用以下nodejs代码将下载的内容流式传输到终端的vim文本编辑器中:
const { spawn } = require('child_process');
const request = require('request');
//
request({
url: 'https://google.com'
}, function (err, res, body) {
const vi = spawn('vi', ['-'], { stdio: ['pipe', process.stdout, process.stderr] });
vi.stdin.write(body);
vi.stdin.end();
});
然后,如果您执行此代码,则从您的终端上,它将下载google的html,并让您对其进行编辑并将其保存在文件中。您可以使用:w myfile.txt
将文件保存到vim中。
有关此问题的进一步阅读:https://2ality.com/2018/05/child-process-streams.html
diff <(curl $url_1) <(curl $url_2)
实际上是在创建2个文件描述符(fd),并将它们用作diff的参数。这几乎与为diff提供2个文件路径
diff downloadedFile1 downloadedFile2
您可以使用以点和下划线开头的文件名来防止覆盖任何其他文件,或者仅检查文件是否存在,然后创建文件并将这些文件用作参数。这样更简单,更清洁。
在this answer中,上述解释为
“ {<(list)
将列表的输出与/dev/fd
中的文件连接起来