Node.js : 줄 바꿈없이 콘솔에 인쇄합니까?


683

줄 바꿈없이 콘솔에 인쇄하는 방법이 있습니까? console객체 문서는 것을에 관한 아무 말도하지 않습니다

console.log()

줄 바꿈으로 stdout에 인쇄합니다. 이 함수는 여러 가지 인수를 printf()비슷한 방식으로 사용할 수 있습니다 . 예:

console.log('count: %d', count);

포맷팅 요소가 첫 번째 문자열에 없으면 util.inspect각 인수에 사용됩니다.

답변:


1058

당신은 사용할 수 있습니다 process.stdout.write():

process.stdout.write("hello: ");

자세한 내용은 문서를 참조하십시오 .


7
이것은 저에게 반대 문제를 해결했습니다. console.log인쇄 된 \n나는 개행 문자를 인쇄를 원하는 경우 그대로.
Paul

@Paulpro는 개행 문자가 '\ n'아닙니까?
Alexander Mills

3
@AlexMills 개행 문자의 이스케이프 시퀀스이지만 개행 문자 자체는 아닙니다. ` followed by an 실제 줄 바꿈 문자를 출력하려고 할 때 리터럴 n`을 얻었습니다.
Paul

379

또한 카운트 다운과 같이 같은 줄에 메시지를 덮어 쓰려면 문자열 끝에 '\ r'을 추가하면됩니다.

process.stdout.write("Downloading " + data.length + " bytes\r");

18
질문에 대한 답변은 아니지만 놀라운 답변입니다. 기다릴 수 없습니다.
longda 2016 년

8
이것은 나를 위해 Windows에서 작동 하지 않습니다 . 그러나 미망인에게는 훌륭하게 작동합니다.
chowey

45
Windows의 경우 다음과 같이 동등한 코드 '\ 033 [0G'를 사용할 수 있습니다.process.stdout.write("Downloading " + data.length + " bytes\033[0G");
GarciadelCastillo

19
하려면 ANSI 이스케이프 코드 엄격 모드에서 작업 할 @GarciadelCastillo에 의해 코멘트 위에서 주어진를, 8 진수 리터럴 대체 \033육각 문자와 \x1b같은 : \x1b[0G. (엄격한 코드와 엄격하지 않은 코드 모두에서 작동)

7
문자열 끝이 아닌 시작 부분에 \ r을 넣으면 Windows에서 작동합니다.
daremkd

20

Windows 콘솔 (Linux도)에서 '\r'동등한 코드로 바꿔야 합니다 \033[0G.

process.stdout.write('ok\033[0G');

VT220 터미널 이스케이프 시퀀스를 사용하여 커서를 첫 번째 열로 보냅니다.


1
현재 줄 대신 여러 줄을 어떻게 백업 하시겠습니까? 상단의 프로그램은 실행이 끝나면이를 무엇 복원하는 동안에 내 전체 버퍼를 대체 할 수있을 것으로 보인다. 아무도 이것이 어떻게하는지 알고 있습니까? i.imgur.com/AtCmEjn.gif
Chev

나는 그것이 아마 이들 중 하나 같은 것을 사용 믿습니다 github.com/mscdex/node-ncurses github.com/chjj/blessed
브랜든

1
그것은 작동하지만 커서도 좋아 [\] 39지고 커서는 첫 번째 문자에서 강조 표시됩니다.var spinner = '|/-\\'.split('');process.stdout.write("["+this.randomElement(spinner)+"] "+message+"\033[0G");
loretoparisi

1
@Chev Top은 ANSI 이스케이프 코드로 작성할 수있는 것이 아니라 특별합니다. 그것은 실제로 당신이 포함 된 대형 C 라이브러리를 설치하지 않는 시스템에서 찾을 수 없습니다 이유입니다 ncurses를 사용합니까
고양이

1
@Chev : 대부분의 사람들은 자신의 FUD로 인해 하드 코드 된 이스케이프 시퀀스를 사용하지 않도록 설득하지만 거의 모든 사람이 VT100을 사용하므로 호환성은 더 이상 문제가되지 않습니다. 언급 한 기능은 "대체 화면"동작입니다. 기본 소개는 man console_codes(Linux 또는 온라인) 에서 찾을 수 있으며 내가 가장 좋아하는 참고 자료는 www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/…입니다 (99 %는 여전히 작동합니다) . 주의 사항 : 널리 배포하기 전에 여러 터미널에서 실험을 테스트 할 준비를하십시오.
i336_

18

@rodowi가 행을 덮어 쓸 수 있다는 점에 대한 훌륭한 추가 기능을 확장 / 향상시킵니다.

process.stdout.write("Downloading " + data.length + " bytes\r");

코드에서 보았 듯이 터미널 커서를 첫 번째 문자에 두지 않으려면 다음을 수행하십시오.

let dots = ''
process.stdout.write(`Loading `)

let tmrID = setInterval(() => {
  dots += '.'
  process.stdout.write(`\rLoading ${dots}`)
}, 1000)

setTimeout(() => {
  clearInterval(tmrID)
  console.log(`\rLoaded in [3500 ms]`)
}, 3500)

를 배치하여 \r다음 인쇄 문 앞에 커서가 교체 문자열이 이전을 덮어 직전 재설정됩니다.


13

util.print도 사용할 수 있습니다. 읽기 : http://nodejs.org/api/util.html#util_util_print

util.print ([...]) # 동기 출력 함수. 프로세스를 차단하고 각 인수를 문자열로 캐스팅 한 다음 stdout으로 출력합니다. 각 인수 뒤에 줄 바꿈을하지 않습니다.

예를 들면 :

// get total length
var len = parseInt(response.headers['content-length'], 10);
var cur = 0;

// handle the response
response.on('data', function(chunk) {
  cur += chunk.length;
  util.print("Downloading " + (100.0 * cur / len).toFixed(2) + "% " + cur + " bytes\r");
});

39
util.print더 이상 사용되지 않습니다
Petr Peller

(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
Green

10

제안하는 많은 답변이있는 것 같습니다.

process.stdout.write

오류 로그가 생성되어야합니다.

process.stderr

대신 다음을 사용하십시오.

console.error

process.stdout.write('\033[0G');아무것도하지 않았 는지 궁금한 사람에게는 stdout버퍼링되어 있기 때문에 drain이벤트 를 기다려야합니다 ( 더 많은 정보 ).

쓰기가 반환되면 이벤트 false가 발생합니다 drain.


4

이 솔루션 중 어느 것도 나를 위해 작동하지 process.stdout.write('ok\033[0G')않으며 단지'\r' 단지 새로운 라인을 만들 수 있지만, 맥 OSX 10.9.2에 덮어 쓰기하지 않습니다.

편집 : 현재 줄을 바꾸려면 이것을 사용해야했습니다.

process.stdout.write('\033[0G');
process.stdout.write('newstuff');

4

엄격 모드를 사용할 때 다음 오류가 발생했습니다.

노드 오류 : "엄격한 모드에서는 8 진 리터럴을 사용할 수 없습니다."

다음 솔루션이 작동합니다 ( source ).

process.stdout.write("received: " + bytesReceived + "\x1B[0G");

ocltal 리터럴 tobsone.orher 숫자 형식 변경
FrancescoMM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.