bash가 출력을 공백으로 감싸도록 강제

bash가 출력을 공백으로 감싸도록 강제

실제로 많은 질문이 있지만 그중 어느 것도 내 특정 요구 사항을 충족하지 못하는 것 같습니다.

저는 tmux.so를 사용하고 있습니다. bash 창이 매우 작습니다( $COLUMNS = 45). 이는 거의 모든 출력이 최대 너비로 래핑된다는 것을 의미하며, 긴 단어가 중간에 래핑되기 때문에 정말 역겹게 보입니다.

와 같은 많은 솔루션이 fold -w 30 -s $FILE파일에서 잘 작동 python하지만 nodejs. 가독성을 위해 출력을 공백으로 묶고 싶습니다.

예를 들어 nodejs asdgasgsdg존재하지 않는 파일을 전달하여 의도적으로 오류를 생성하는 경우 출력은 다음과 같습니다.

Error: Cannot find module '/home/User/
Documents/cwd/asdgasdg'
    at Function.Module._resolveFilename (
module.js:326:15)
    at Function.Module._load (module.js:277:
25)
    at Function.Module.runMain (module.js:442
:10)
    at startup (node.js:136:18)
    at node.js:966:3

바꾸다:

Error: Cannot find module '/home/User/Docume
nts/cwd/asdgasdg'
    at Function.Module._resolveFilename (modu
le.js:326:15)
...

이 패키징을 강제하는 간단한 명령이 필요합니다. 비슷한 것을 생각하고 있었는데 nodejs non-existent-file.js | fold -w 45작동하지 않습니다.

또한 출력을 파일로 파이프한 다음 를 사용하여 파일을 열어 보았지만 오류 메시지를 파이프로 보낼 fold수 없습니다 . 스크립트를 파일에 기록하도록 수동으로 강제하는 것이 아니라 강제로nodejsoutput.txt단말기작업을 수행합니다. (즉, work 와 동등한 것을 원합니다 nodejs non-existent-file.js > output.txt; fold -w 45 -s output.txt. 시도해 보면 output.txt비어 있습니다.)

가능합니까?

답변1

파이핑은 fold출력이 터미널이 될 필요가 없는 모든 프로그램에 실제로 작동합니다. 프로그램에서 출력을 터미널로 요구하는 경우 자체 형식이 있기 때문일 가능성이 높습니다.

nodejs non-existent-file.js | fold -w 45"작동하지 않습니다" 왜냐하면 모든 출력을 으로 파이프하는 것이 아니라 fold단지표준 출력(즉, 애플리케이션 데이터). stdout에 가입해야 합니다.표준 에러파이프라인을 입력합니다.

nodejs non-existent-file.js 2>&1 | fold -w 45

하지만 추가적인 문제가 있습니다. 파이프에 기록된 데이터는 일반적으로버퍼 레드터미널에 쓸 때 데이터는 기본적으로 버퍼링되지 않습니다. 파이프는 터미널로 출력하고 있으므로 버퍼링을 비활성화해야 합니다. GNU 유틸리티를 사용하면 다음을 사용할 수 있습니다.표준 버퍼.

또한 파이핑은 명령에서 반환된 상태에 대한 정보를 파괴합니다. Bash에서는 다음을 사용할 수 있습니다.PIPESTATUS명령 상태를 복원하면 pipestatus동일한 효과가 나타납니다. 또는 ksh93, bash 또는 zsh에서 사용할 수 있습니다프로세스 교체;그러나 bash는 프로세스 대체 명령이 완료될 때까지 기다리지 않으며, 이 역시 문제입니다.

또한 이 래핑은 출력이 터미널인 경우에만 수행되어야 합니다. 로그를 파일로 래핑하는 것은 많은 정보를 파괴하므로 매우 성가신 일이 될 수 있습니다(더 이상 개행 문자에 의존할 수 없습니다).

#!/bin/bash
run_with_word_wrap () {
  if [ -t 1 ]; then
    stdbuf -oL -eL "$@" 2>&1 | fold -w "$COLUMNS"
    return ${PIPESTATUS[0]}
  else
    "$@"
  fi
}

run_with_word_wrap nodejs non-existent-file.js

관련 정보