고정 너비로 ​​매뉴얼 페이지 인쇄

고정 너비로 ​​매뉴얼 페이지 인쇄

예제 명령 사용

man apropos > outputfile

서식이 지정된 man페이지가 포함된 텍스트 파일을 생성합니다 apropos( man apropos굵은 문자 등 화면에 직접 인쇄하는 것과 약간의 차이가 있음).

하지만 생성된 출력 파일의 최대 줄 너비를 수동으로 설정하여 모든 단락이 해당 너비에 맞춰지도록 하고 싶습니다.

man페이지는 다음과 같은 방식으로 생성됩니다 . 예를 들어 원본 소스 텍스트 파일의 한 단락을 앞에 넣으려고 groff했지만 여러 페이지에서 작업해야 하는 경우에는 이것이 쉽지 않습니다 . 또한 일부 문자는 인식되지 않습니다..ll 50.gz manman

apropos.1:45: warning: can't find character with input code 195
apropos.1:45: warning: can't find character with input code 168
apropos.1:47: warning: can't find character with input code 178
apropos.1:131: warning: can't find character with input code 169

그래서 좀 더 직접적인 방법이 있는지 궁금합니다. 생성하는 동안 최대 선 너비를 수정하는 방법은 무엇입니까 outputfile? 특별한 주문이 있나요?


편집하다:

(아래의 모든 참고 사항은 Ubuntu 18.04에 관한 것입니다. 위 질문의 14.04를 포함하여 이전 버전에서는 더 이상 테스트할 수 없습니다.)

한 줄 임시 솔루션의 경우 MANWIDTH사용자 정의 값으로 내보내지 않은 경우 둘 사이에는 차이가 없습니다.

$ MANWIDTH=60 man apropos > outputfile

그리고

$ COLUMNS=60 man apropos > outputfile

MANWIDTH그러나 원칙적으로는 처음 사용하는 것이 더 좋습니다.


편집 2(질문과 엄격하게 관련되지 않음):

대신 매뉴얼 페이지 인쇄에 영구 너비 설정을 적용하려면 다음이 필요합니다.출구변수의 예상 값입니다. 그리고:

$ export MANWIDTH=60
# zero or more additional lines
$ man apropos > outputfile

man apropos터미널 창 크기 조정 방법에 관계없이 동일한 너비로 인쇄됩니다. 대신에,

$ export COLUMNS=60
# zero or more additional lines
$ man apropos > outputfile

터미널 창의 크기가 export와 사이에서 조정 되지 않은 경우에만 이전과 동일한 결과를 제공합니다 man <page> > outputfile.

답변1

MANWIDTH환경 변수를 사용하십시오 .

MANWIDTH=60 man apropos > apropos.txt

man 2.7.4의 맨페이지에는 다음과 같이 나와 있습니다.

$MANWIDTH가 설정된 경우 해당 값은 매뉴얼 페이지의 형식을 지정해야 하는 줄 길이로 사용됩니다. 설정하지 않으면 매뉴얼 페이지는 현재 터미널에 적합한 행 길이로 형식화됩니다(사용 가능한 경우 $COLUMNS, ioctl(2) 값 사용, 둘 다 사용할 수 없는 경우 80자로 대체).

즉, COLUMNSioctl값을 재정의합니다. 창 크기가 변경될 때마다 해당 값이 동적으로 업데이트되므로 수정에 의존하고 싶지 않습니다 COLUMNS(여기에서는 작동하지만).

재정의를 사용하면 MANWIDTH쉘 시작 파일에 행을 추가하여 COLUMNS변경 사항을 영구적으로 적용 할 수도 있습니다.export MANWIDTH=60

답변2

COLUMNS환경변수를 설정해 보세요 . Debian 1.22.3에서는 버전 2.7.0.2를 사용할 수 있습니다 man.mandbgroff

$ COLUMNS=60 man apropos | head
APROPOS(1)          Manual pager utils          APROPOS(1)



NAME
       apropos - search the manual page names and descrip‐
       tions

SYNOPSIS
       apropos [-dalv?V] [-e|-w|-r]  [-s  list]  [-m  sys‐

$ COLUMNS=70 man apropos | head
APROPOS(1)               Manual pager utils               APROPOS(1)



NAME
       apropos - search the manual page names and descriptions

SYNOPSIS
       apropos  [-dalv?V] [-e|-w|-r] [-s list] [-m system[,...]] [-M
       path] [-L locale] [-C file] keyword ...

Ubuntu 14.04 버전의 경우 다음과 같이 작성해야 합니다.

COLUMNS=60 < /dev/null man apropos | head

여기서 stdin이 터미널인 경우 man환경 변수는 무시된 것처럼 보입니다(그런 다음 터미널 장치에서 터미널 너비를 쿼리합니다).COLUMNS

다음을 시도해 볼 수도 있습니다.

s=$(stty -g); stty cols 60; man apropos | head; stty "$s"

zsh다음과 같이 단축할 수 있습니다 .

STTY='cols 60' man apropos | head

groff수동으로 호출하여 이 작업을 수행 할 수 있습니다 .

gzip -dcf "$(man -w apropos)" |
  groff -ekpstR -mtty-char -mandoc -Tutf8 -rLL=60n |
  col -bpx

옵션 groff은 다음과 같습니다:


# Native groff Options

-e     eqn      (equations)
-k     preconv  (encoding for groff)
-p     pic      (pictures)
-s     soelim   (.so requests - source file)
-t     tbl      (format tables)
-R     refer    (bibliography)

# Transparent Options

-mtty-char
      Overrides  the  definition of standard  troff characters  and
      some groff characters for TTY devices. The optical appearance
      is  intentionally inferior  compared to  that  of normal  TTY 
      formatting to allow processing with critical  equipment.

-mandoc
      Use this file  in case you don't know  whether the man macros
      or the mdoc package should be used.    Multiple man pages (in 
      either format) can be handled.

-R     utf8     (output-encoding)


-r     LL=60n   (Number of LL registers)

당신의입력 코드에서 문자를 찾을 수 없습니다을 사용하는 -Tascii대신 을 사용하여 파일을 전처리 하고 있기 때문에 오류가 발생합니다 .-Tutf8-kpreconv

답변3

fmt내가 아는 한 모든 Linux 배포판에 존재하는 이 명령을 사용할 수 있습니다 .

man apropos | fmt -w 70 

70자로 마무리됩니다.

답변4

당신은 그것을 사용할 수 있습니다fold

man cp | fold -w 20

20자(!)마다 축소됩니다. 유일한 옵션은 "20자마다 접기"이므로 단어가 반으로 줄어듭니다.

이를 염두에 두고 sed다음과 같이 사용할 수 있습니다(동적 행 길이 사용).

man cp | sed 's/.\{20\} /&\n/g'

임의의 20개 문자 뒤에 개행 문자가 추가되고 그 뒤에 공백(즉, 새 단어)이 추가됩니다. 따라서 줄은 20자보다 길 수 있습니다. (20자 뒤에 공백이 따라오므로 26자 단어는 26자 줄을 생성합니다.)

sed명령에서 마지막 공백을 생략합니다 .

sed 's/\(.\{20\}\) /\1\n/g'

관련 정보