programing

child_process를 사용합니다.execSync지만 출력은 콘솔에 유지

goodsources 2023. 5. 26. 20:53
반응형

child_process를 사용합니다.execSync지만 출력은 콘솔에 유지

저는 그것을 사용하고 싶습니다.execSync메서드는 NodeJS 0.12에서 추가되었지만 여전히 Node 스크립트를 실행한 콘솔 창에 출력이 있습니다.

예: 노드를 실행하는 경우다음 행이 있는 JS 스크립트 콘솔 내부의 rsync 명령 "live"의 전체 출력을 보고 싶습니다.

require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"');

이해는 합니다.execSync명령 출력을 반환하고 실행 후 콘솔에 출력할 수 있지만 이렇게 하면 "실시간" 출력이 없습니다...

원하는 경우 부모의 stdio를 자식 프로세스에 전달할 수 있습니다.

require('child_process').execSync(
    'rsync -avAXz --info=progress2 "/src" "/dest"',
    {stdio: 'inherit'}
);

간단히 사용할 수 있습니다..toString().

var result = require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"').toString();
console.log(result);

편집: 이를 돌이켜보면 명령 실행이 완료된 후에만 출력이 '실시간'으로 표시되지 않기 때문에 실제로는 특정 질문에 답하지 않는다는 것을 알게 되었습니다.

하지만 실행 후 명령 결과를 인쇄하는 방법을 찾는 사람들이 꽤 많다는 것을 알고 있기 때문에 이 답변을 여기에 남깁니다.

승인된 답변에 따라 stdout 및 stderr을 리디렉션하지 않는 한 execSync 또는 snaSync에서는 이 작업이 불가능합니다.stdout 및 stderr을 리디렉션하지 않고 명령이 완료된 경우에만 stdout 및 stderr을 반환합니다.

stdout 및 stderr을 리디렉션하지 않고 이를 수행하려면 sna를 사용해야 하지만 매우 간단합니다.

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

//kick off process of listing files
var child = spawn('ls', ['-l', '/']);

//spit stdout to screen
child.stdout.on('data', function (data) {   process.stdout.write(data.toString());  });

//spit stderr to screen
child.stderr.on('data', function (data) {   process.stdout.write(data.toString());  });

child.on('close', function (code) { 
    console.log("Finished with code " + code);
});

저는 당신이 빠르게 테스트할 수 있도록 파일을 재귀적으로 나열하는 ls 명령을 사용했습니다.스판은 첫 번째 인수로 실행하려는 실행 파일 이름을 사용하고 두 번째 인수로 해당 실행 파일에 전달할 각 매개 변수를 나타내는 문자열 배열을 사용합니다.

그러나 execSync를 사용하도록 설정되어 있고 어떤 이유로 stdout 또는 stderr을 리디렉션할 수 없는 경우 xterm과 같은 다른 터미널을 열고 다음과 같은 명령을 전달할 수 있습니다.

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

execSync("xterm -title RecursiveFileListing -e ls -latkR /");

이렇게 하면 새 터미널에서 명령이 수행 중인 작업을 확인할 수 있지만 동기식 호출은 계속 사용할 수 있습니다.

단순:

 try {
    const cmd = 'git rev-parse --is-inside-work-tree';
    execSync(cmd).toString();
 } catch (error) {
    console.log(`Status Code: ${error.status} with '${error.message}'`;
 }

참조: https://stackoverflow.com/a/43077917/104085

// nodejs
var execSync = require('child_process').execSync;

// typescript
const { execSync } = require("child_process");

 try {
    const cmd = 'git rev-parse --is-inside-work-tree';
    execSync(cmd).toString();
 } catch (error) {
    error.status;  // 0 : successful exit, but here in exception it has to be greater than 0
    error.message; // Holds the message you typically want.
    error.stderr;  // Holds the stderr output. Use `.toString()`.
    error.stdout;  // Holds the stdout output. Use `.toString()`.
 }

여기에 이미지 설명 입력

여기에 이미지 설명 입력

명령이 성공적으로 실행될 때:

더하다{"encoding": "utf8"}옵션으로

execSync(`pwd`, {
  encoding: "utf8"
})

언급URL : https://stackoverflow.com/questions/30134236/use-child-process-execsync-but-keep-output-in-console

반응형