node.js에서 shell 명령을 실행하여 출력을 가져옵니다.
node.js에서 유닉스 terminal 명령어의 출력을 얻는 방법을 찾고 싶습니다.이것을 할 수 있는 방법이 없을까요?
function getCommandOutput(commandString){
// now how can I implement this function?
// getCommandOutput("ls") should print the terminal output of the shell command "ls"
}
이것은 제가 현재 진행 중인 프로젝트에서 사용하고 있는 방법입니다.
var exec = require('child_process').exec;
function execute(command, callback){
exec(command, function(error, stdout, stderr){ callback(stdout); });
};
git 사용자를 검색하는 예:
module.exports.getGitUser = function(callback){
execute("git config --global user.name", function(name){
execute("git config --global user.email", function(email){
callback({ name: name.replace("\n", ""), email: email.replace("\n", "") });
});
});
};
7.6 이후의 노드를 사용하고 있고 콜백 스타일이 마음에 들지 않으면 노드-유틸의 것을 사용할 수도 있습니다.promisify
와 함께 일을 보다async / await
셸 명령어를 얻어서 깨끗하게 읽습니다.다음은 이 기법을 사용하여 승인된 답변의 예입니다.
const { promisify } = require('util');
const exec = promisify(require('child_process').exec)
module.exports.getGitUser = async function getGitUser () {
// Exec output contains both stderr and stdout outputs
const nameOutput = await exec('git config --global user.name')
const emailOutput = await exec('git config --global user.email')
return {
name: nameOutput.stdout.trim(),
email: emailOutput.stdout.trim()
}
};
이를 통해 실패한 명령에 대해 거부된 약속을 반환할 수 있는 추가적인 이점도 있습니다.try / catch
비동기 코드 안에 있습니다.
child_process를 찾고 있습니다.
var exec = require('child_process').exec;
var child;
child = exec(command,
function (error, stdout, stderr) {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null) {
console.log('exec error: ' + error);
}
});
Renato가 지적한 바와 같이, 동기화 실행 패키지도 있습니다. 더 많은 것을 찾을 수 있는 동기화 실행을 참조하십시오.단, node.js는 단일 스레드 고성능 네트워크 서버로 설계되어 있으므로, 만약 그것을 사용하고자 한다면, 시작하는 동안에만 사용하지 않는 한 동기화 실행과 같은 것을 멀리해야 합니다.
요구 사항들
이렇게 하려면 Promise 및 Async/Wait을 지원하는 Node.js 7 이상이 필요합니다.
해결책
의 동작을 제어하기 위한 약속을 활용하는 래퍼 함수를 만듭니다.child_process.exec
지휘.
설명.
약속과 비동기 기능을 사용하면 셸이 콜백 지옥에 빠지지 않고 꽤 깔끔한 API로 출력을 반환하는 동작을 모방할 수 있습니다.사용.await
키워드를 사용하면 쉽게 읽을 수 있는 스크립트를 만들 수 있지만 작업을 얻을 수 있습니다.child_process.exec
다 했어요.
코드샘플
const childProcess = require("child_process");
/**
* @param {string} command A shell command to execute
* @return {Promise<string>} A promise that resolve to the output of the shell command, or an error
* @example const output = await execute("ls -alh");
*/
function execute(command) {
/**
* @param {Function} resolve A function that resolves the promise
* @param {Function} reject A function that fails the promise
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
*/
return new Promise(function(resolve, reject) {
/**
* @param {Error} error An error triggered during the execution of the childProcess.exec command
* @param {string|Buffer} standardOutput The result of the shell command execution
* @param {string|Buffer} standardError The error resulting of the shell command execution
* @see https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
*/
childProcess.exec(command, function(error, standardOutput, standardError) {
if (error) {
reject();
return;
}
if (standardError) {
reject(standardError);
return;
}
resolve(standardOutput);
});
});
}
사용.
async function main() {
try {
const passwdContent = await execute("cat /etc/passwd");
console.log(passwdContent);
} catch (error) {
console.error(error.toString());
}
try {
const shadowContent = await execute("cat /etc/shadow");
console.log(shadowContent);
} catch (error) {
console.error(error.toString());
}
}
main();
샘플 출력
root:x:0:0::/root:/bin/bash
[output trimmed, bottom line it succeeded]
Error: Command failed: cat /etc/shadow
cat: /etc/shadow: Permission denied
온라인으로 해보세요.
외부자원
약속.
Node.js 지원 테이블.
Renato의 답변 덕분에 저는 정말 기본적인 예를 하나 만들었습니다.
const exec = require('child_process').exec
exec('git config --global user.name', (err, stdout, stderr) => console.log(stdout))
그냥 글로벌 git 사용자 이름을 인쇄해 드립니다 :)
nodejs와 함께 제공되는 util 라이브러리를 사용하여 exec 명령에서 약속을 얻고 필요에 따라 해당 출력을 사용할 수 있습니다.파괴를 사용하여 stdout 및 stderrin 변수를 저장합니다.
const util = require('util');
const exec = util.promisify(require('child_process').exec);
async function lsExample() {
const {
stdout,
stderr
} = await exec('ls');
console.log('stdout:', stdout);
console.error('stderr:', stderr);
}
lsExample();
사용가능ShellJS
꾸러미의
셸JS는 Node.js API 위에 유닉스 셸 명령을 휴대용으로 구현한 것입니다.
참조: https://www.npmjs.com/package/shelljs#execcommand--options--callback
import * as shell from "shelljs";
//usage:
//exec(command [, options] [, callback])
//example:
const version = shell.exec("node --version", {async: false}).stdout;
console.log("nodejs version", version);
승인된 답변에 대한 비동기 타입스크립트 구현은 다음과 같습니다.
const execute = async (command: string): Promise<any> => {
return new Promise((resolve, reject) => {
const exec = require("child_process").exec;
exec(
command,
function (
error: Error,
stdout: string | Buffer,
stderr: string | Buffer
) {
if (error) {
reject(error);
return;
}
if (stderr) {
reject(stderr);
return;
} else {
resolve(stdout);
}
}
);
});
};
언급URL : https://stackoverflow.com/questions/12941083/execute-and-get-the-output-of-a-shell-command-in-node-js
'programing' 카테고리의 다른 글
Node.js와 함께 사용하기에 가장 좋은 테스트 프레임워크는 무엇입니까? (0) | 2023.09.13 |
---|---|
ONOS 웹 응용 프로그램을 MariaDB.ClassNotFoundException에 연결하는 중 (0) | 2023.09.13 |
AJAX를 통해 워드프레스의 탐색 링크(다음 및 이전)를 동적으로 변경 (0) | 2023.09.13 |
편집 텍스트를 한 줄로 제한 (0) | 2023.09.13 |
VBA를 사용하여 Excel 피벗 테이블 필터링 (0) | 2023.09.13 |