2016-08-22 4 views
1

child_process.exec를 통해 nodejs에서 터미널 명령을 실행하면 실제 터미널에서 명령을 실행할 때보 다 다른 출력이 발생합니다.nodejs exec가 실제 터미널에서 함수 호출보다 다른 출력을 제공합니다.

내 코드는 다음과 같습니다

$ 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에 나는 표준 출력으로이 문자열을 얻을 : 내가 진짜 터미널에서이 명령을 실행하면

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를 얻을 수 :

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

왜 출력이 유사하지 않은지, 왜 nodejs 호출이 내게 127.0을 출력하는지 궁금합니다. 0.1 IP는 명령에서 제외 되었기 때문입니다.

답변

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'" 

해석됩니다 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#Escape_notation

그래서 문자열 : C 또는 유사한 언어로, \ 문자열에서 특별한 의미를 가지고 같은 JS에서 그 기억 \. 이것은 분명히 잘못된 정규 표현식을 사용하게합니다. 이 문제를 해결하려면

탈출하여 \ :

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

좋은 질문입니다. 왜 노드가 그것을하고 있는지 전혀 알 수 없습니다.

하지만 "\ n"문자를 모두 제거하면 문제를 해결할 수 있습니다. nodejs 출력의 "\ n"은 "end of line"을 의미하므로 원하는 결과를 얻을 수 있습니다.

은 아마 결과는 다음 이미지처럼오고 :

"\n" means "end of line"

관련 문제