我有一个包含三个echo语句的shell脚本:
echo 'first message'
echo 'second message'
echo 'third message'然后在节点中运行此脚本并通过以下代码收集输出:
var child = process.spawn('./test.sh');
child.stdout.on('data', data => {
data = JSON.stringify(data.toString('utf8'));
console.log(data);
});但是单数输出是"first message\nsecond message\nthird message\n",这是一个问题。我期望有三个输出,没有一个因为某种形式的缓冲而混在一起。我不能在换行符上分开,因为单独的输出可能包含换行符。
有任何方法来区分单个echo语句的消息吗?(或其他输出命令,即printf,或任何导致将数据写入stdout或stderror的命令)
编辑:我尝试过unbuffer和stdbuf,这两种方法都没有用,因为简单的测试可以证明这一点。下面是stdbuf尝试的一个例子,我尝试了各种不同的参数值,基本上是所有可能的选项。
var child = process.spawn('stdbuf', ['-i0', '-o0', '-e0', './test.sh']);要明确的是,当我从节点运行python脚本时也会出现这个问题,只有三个简单的print语句。所以它是语言不可知论的,它不是特别的bash脚本。它是关于在基于unix的系统上成功地检测任何语言中脚本的单个输出。如果这是C/C++所能做的,并且我必须从节点连接到它,我愿意去那里。欢迎任何可行的解决方案。
编辑:最初通过将脚本的输出连接到sed并使用s/$/uniqueString在每个单独输出的末尾插入标识符,然后将接收到的该标识符上的数据拆分来解决这个问题。
我给出的答案是,将工作在单行输出,但中断多行输出。我测试中的一个错误让我认为事实并非如此,但事实确实如此。接受的答案是更好的解决方案,并将工作在任何规模的输出。但是,如果您无法控制脚本并必须处理用户创建的脚本,那么我的sed解决方案是我发现的唯一有效的解决方案。它确实很管用,很好。
发布于 2019-05-16 22:32:21
如果您期望test.sh的输出总是逐行发送,那么您最好的选择是使用readline。
const readline = require('readline');
const {spawn} = require('child_process');
const child = spawn('./test.sh');
const rl = readline.createInterface({
input: child.stdout
});
rl.on('line', (input) => {
console.log(`Received: ${input}`);
});https://stackoverflow.com/questions/56032290
复制相似问题