7

我有一个 NodeJS 脚本,它是一个子进程来捕获文件的 cat 转储:

var exec = require('child_process').exec;
var result = '';
var child = exec('./scripts/first.sh',function(err, stdout, stderr) {
    result = stdout.split("=");
});

如果文件不存在,我会转储另一个文件:

var result = '';
var child = exec('./scripts/first.sh',function(err, stdout, stderr) {
    result = stdout.split("=");
    if(stdout.indexOf('No such file or directory') != -1){
        var child = exec('./scripts/second.sh', function(err, stdout, stderr) {
            result = stdout.split("=");
    });
});

最后我记录结果变量的值:

console.log(result);

这些文件将具有如下所述的数据:

line_1 = 7888
line_2 = 8998
line_3 = 9090
line_4 = 9097

我需要解析和提取 line_1 和 line_3 的值吗?

结果变量不显示任何值。我的想法是在字符串变量中获取标准输出数据并使用一些搜索机制。

虽然我不确定这种方法,因为我对 JS / NodeJS 没有太多经验。

==编辑==

请找到我编写的函数的副本。

var exec = require('child_process').exec;

function getdetail() {
        var result = '';
        var child = exec('./scripts/first.sh', function(err, stdout, stderr) {
                if(stdout.indexOf('No such file or directory') != -1){
                        var child = exec('./scripts/second.sh',function(err, stdout, stderr) {
                        result = stdout.toString().split("=");
                        console.log(result);
                        });
                }
                else
                {
                        result = stdout.toString().split("=");
                        console.log(result);
                }
        });
}

stdout 流对象上的 tostring() 起到了作用,但我得到了控制台日志,如下所述:

[ 'spawn ssh -o UserKnownHostsFile',
  '/dev/null -o StrictHostKeyChecking',
  'no user@www.mybox.com cat ver.txt\r\nWarning: Permanently added \'www.mybox.com,XX.XX.XX.XX\' (RSA) to the list of known hosts.\r\r\nuser@www.mybox.com\'s password: \r\line_1',
  '9400\r\nline_2',
  '3508\r\nline_3',
  '77f3\r\nline_4',
  '/tmp\r\nline_5',
  '/tmp/ramdisk/\r\nline_5',
  '77f3\r\n' ]

如何提取 line_1 和 line_3 的值?

4

1 回答 1

12

exec是异步的。因此,如果您编写如下内容:

var result = '';
var child = exec('...'), function() { result = 'abc'; } );
console.log(result);

然后result可能是空的,因为console.log(result)can 并且经常会在 exec 返回其回调并填充新值之前执行。

要解决此问题,您需要在 exec 的回调函数中异步处理结果。

此外,我不确定您检查错误的方式是否是最好的。err您可以简单地测试是否具有非空值,而不是检查“没有这样的文件或目录” :

if(err) {

综上所述,我们最终得到以下代码:

var exec = require('child_process').exec;

var result = '';
var processResult = function(stdout) {
    var result = stdout.split("=");
    console.log(result);
};

var child = exec('./scripts/first.sh',function(err, stdout, stderr) {
    if(err) {
        var child = exec('./scripts/second.sh', function(err, stdout, stderr) {                         
            processResult(stdout);
        });
    } else {            
        processResult(stdout);
    }
});

如果您需要进一步处理标准输出数据,则需要对其进行迭代以找出所有可能出现的包含“key=value”的字符串。这是一个粗略的想法:

var processResult = function(stdout) {  
    var lines = stdout.toString().split('\n');
    var results = new Array();
    lines.forEach(function(line) {
        var parts = line.split('=');
        results[parts[0]] = parts[1];
    });

    console.log(results);
};

我希望这能让你开始。

于 2012-10-18T13:38:22.643 回答