nodejs exec在真实终端

时间:2016-08-22 15:04:31

标签: node.js shell

我遇到的问题是,当我通过child_process.exec在nodejs中运行终端命令时,我获得的另一个输出比在真实终端中运行命令时更多。

我的代码如下所示:

function checkLocalIP() {
    logger.debug("Checking the local IP");

    execute("ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'", function(localIP) {
        if(isIp.v4(localIP)) {
            logger.debug("Local IP found",{localIP:localIP});
            return true;
        } else {
            logger.error("Local IP not found",{localIP:localIP});
            return false;
        }
    });
}

function execute(command, callback){
    logger.debug("Executing command: "+command,{command:command});
    exec(command, function(error, stdout, stderr){
        callback(stdout);
    });
}

如果我在真正的终端中运行此命令,我只能得到这样的IP:

$ ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
$ 192.168.178.222

但在nodejs中,我将此字符串作为stdout:

"ine\nt 127.0\n.0.1\nine\nt 192.168\n.178.222"

我想知道为什么输出不相似以及为什么nodejs调用也输出127.0.0.1 IP,因为它在命令中被排除。

2 个答案:

答案 0 :(得分:1)

请记住逃避\。请记住,在js中,例如在C或类似语言中,\在字符串中具有特殊含义:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#Escape_notation

所以你的字符串:

"ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'"

被解释为:

ifconfig | grep -Eo 'inet (addr:)?([0-9]*.){3}[0-9]*' | grep -Eo '([0-9]*.){3}[0-9]*' | grep -v '127.0.0.1'

请注意丢失的\。这显然会导致使用错误的正则表达式。

要修复它,请转义\

"ifconfig | grep -Eo 'inet (addr:)?([0-9]*\\.){3}[0-9]*' | grep -Eo '([0-9]*\\.){3}[0-9]*' | grep -v '127.0.0.1'"

答案 1 :(得分:0)

这是一个很好的问题,我不知道为什么节点会这样做。

但也许你可以修复它删除所有“\ n”字符。 nodejs输出中的“\ n”表示“行尾”,因此您的搜索将提供您想要的结果。

可能结果如下图所示:

"\n" means "end of line"