Node.js 프로그램에서 터미널 명령어 실행하기
Node.js 프로그램에서 실제 터미널 명령 실행하기
Node.js
child_process모듈을 사용하면 현재 실행 중인 Node.js 프로세스 외에 새로운 프로세스를 생성하여 셸 명령어를 실행하거나 다른 프로그램을 실행할 수 있게 해준다.
exec()
셸 명령어를 실행하기 위해서는 exec() 함수를 사용하면 된다.
이 함수는 셸을 먼저 실행한 뒤, 그 셸에서 명령어를 실행한다. 명령어 실행이 완료되면 모든 결과를 버퍼에 담아 한 번에 콜백 함수로 전달한다.
const { exec } = require("child_process");
exec(command, [options], (error, stdout, stderr) => {
// 콜백 함수 로직
});
options
options 객체를 통해 exec의 동작을 세밀하게 제어할 수 있다.
| 옵션 | 설명 |
|---|---|
cwd | 자식 프로세스의 현재 작업 디렉토리를 지정 |
env | 자식 프로세스에 전달할 환경 변수를 키-값 쌍의 객체로 설정 |
shell | 명령어를 실행할 셸의 경로를 지정 |
maxBuffer | stdout 또는 stderr에 허용되는 최대 버퍼 크기를 바이트 단위로 지정 |
콜백함수
비동기적으로 명령어를 실행한 뒤, 실행이 완전히 종료되면 결과를 정리해 이 콜백함수를 호출한다.
(error, stdout, stderr) => {
// ... 로직 ...
};
error
error 객체는 명령어 실행 과정에서 오류가 발생했을 때 전달되는 값이다.
오류가 없다면 null이다.
stdout
stdout은 명령어의 표준 출력(standard output) 결과를 담고 있는 문자열 또는 버퍼이다.
명령어가 성공적으로 실행되어 화면에 출력하는 모든 내용이 여기에 담긴다.
const { exec } = require("child_process");
// 현재 디렉토리의 파일 목록을 출력하는 'ls -l' 명령어
exec("ls -l", (error, stdout, stderr) => {
if (error) {
console.error(`error: ${error.message}`);
return;
}
// stdout에는 'ls -l'의 결과(파일 목록)가 들어 있습니다.
console.log(`표준 출력 결과:\n${stdout}`);
});
stderr
stderr는 명령어의 표준 에러(standard error) 출력을 담고 있는 문자열 또는 버퍼이다.
주로 경고 메시지나 진행 상황 알림, 또는 실제 오류 메시지를 출력하는 데 사용된다.
중요한 점은 stderr에 값이 있다고 해서 반드시 명령어가 실패한 것은 아니라는 점이다.
일부 프로그램은 오류가 아닌 정보성 메시지(e.g. 진행률 표시)를 stderr로 출력하기도 한다.
따라서 명령어의 성공/실패 여부는 반드시 error 객체의 유무로 따져야한다.