일부 쉘 내장 명령이 부족한 완전한 매뉴얼에 표시 가질 수 있다는 것이 사실이지만 - 특히 사람들을 위해 bash
당신이 GNU 시스템에서 사용하기 만 가능성이 있음 - 특정 내장 명령 을 믿지 않는, 원칙적으로 (는 GNU 사람들, man
그리고 자신의 선호 info
) 페이지 - 그렇지 않으면 쉘 내장 명령 또는 - - POSIX 유틸리티의 대부분은 아주 잘 POSIX 프로그래머 가이드에 표시됩니다.
여기 내 바닥에서 발췌 한 것입니다 man sh
(아마 20 페이지 정도일 수 있습니다 ...)
그 모든이 있고, 다른 사람은 언급하지 않은 set
, read
, break
... 음, 내가 그들 모두 이름을 할 필요가 없습니다. 그러나 (1P)
오른쪽 하단에-POSIX 카테고리 1 매뉴얼 시리즈를 나타냅니다-그것들은 man
내가 말하고 있는 페이지입니다.
패키지를 설치해야 할 수도 있습니다. 이것은 데비안 시스템에 유망한 것으로 보입니다. help
유용 하지만 찾을 수 있으면 분명히 해당 POSIX Programmer's Guide
시리즈 를 가져와야합니다. 매우 도움이 될 수 있습니다. 그리고 구성 페이지는 매우 상세합니다.
그 외에도 쉘 내장은 거의 항상 특정 쉘 매뉴얼의 특정 섹션에 나열되어 있습니다. zsh
예를 들어, 그에man
대한 별도의 전체 페이지가 있습니다 (총 8 또는 9 정도의 개별 zsh
페이지가 있다고 생각합니다 zshall
.
당신 grep
man
은 물론 할 수 있습니다 :
man bash 2>/dev/null |
grep '^[[:blank:]]*read [^`]*[-[]' -A14
read [-ers] [-a aname] [-d delim] [-i text] [-n
nchars] [-N nchars] [-p prompt] [-t timeout] [-u
fd] [name ...]
One line is read from the standard input, or
from the file descriptor fd supplied as an
argument to the -u option, and the first
word is assigned to the first name, the sec‐
ond word to the second name, and so on, with
leftover words and their intervening separa‐
tors assigned to the last name. If there
are fewer words read from the input stream
than names, the remaining names are assigned
empty values. The characters in IFS are
used to split the line into words using the
same rules the shell uses for expansion
... 쉘 man
페이지를 검색 할 때 사용한 것과 매우 비슷 합니다. 그러나 대부분의 경우에 help
아주 좋습니다 bash
.
실제로 sed
최근에 이런 종류의 물건을 처리하기 위해 스크립트를 작성하고 있습니다. 위의 그림에서 섹션을 잡은 방법입니다. 여전히 내가 좋아하는 것보다 더 길지만 개선되고 있으며 꽤 유용 할 수 있습니다. 현재 반복에서는 명령 행에 주어진 [a] 패턴을 기반으로 섹션 또는 하위 섹션 제목과 일치하는 상황에 맞는 텍스트 섹션을 상당히 안정적으로 추출합니다. 출력을 채색하고 표준 출력으로 인쇄합니다.
들여 쓰기 수준을 평가하여 작동합니다. 비 공백 입력 라인은 일반적으로 무시되지만 빈 라인이 발견되면주의를 기울이기 시작합니다. 다른 빈 줄이 발생하기 전에 첫 번째 줄보다 현재 시퀀스가 확실히 더 들여 쓰기되는지 확인할 때까지 거기에서 줄을 수집합니다. 그렇지 않으면 스레드를 삭제하고 다음 빈을 기다립니다. 테스트가 성공하면 명령 줄 인수와 리드선을 일치 시키려고 시도합니다.
이는 일치 패턴이 다음과 일치 함을 의미합니다 .
heading
match ...
...
...
text...
..과..
match
text
..하지만..
heading
match
match
notmatch
..또는..
text
match
match
text
more text
일치하는 것이 있으면 인쇄를 시작합니다. 인쇄 된 모든 줄에서 일치하는 줄의 선행 공백을 제거합니다. 따라서 들여 쓰기 수준에 상관없이 해당 줄이 맨 위에있는 것처럼 인쇄합니다. 일치하는 줄과 같거나 적은 들여 쓰기 수준에서 다른 줄이 나타날 때까지 계속 인쇄되므로 전체 섹션에는 포함 된 단락의 일부 / 모든 하위 섹션을 포함하여 제목이 일치합니다.
따라서 기본적으로 패턴과 일치하도록 요청하면 특정 제목의 제목에만 적용되며 일치하는 섹션에서 찾은 모든 텍스트를 색칠하고 인쇄합니다. 첫 번째 줄의 들여 쓰기를 제외 하고는이 작업을 수행 할 때 아무것도 저장되지 않으므로 매우 빠르며 \n
거의 모든 크기의 ewline으로 구분 된 입력을 처리 할 수 있습니다 .
다음과 같은 소제목으로 재귀하는 방법을 알아내는 데 잠시 시간이 걸렸습니다.
Section Heading
Subsection Heading
그러나 결국 그것을 정리했습니다.
그러나 단순화를 위해 모든 것을 재 작업해야했습니다. 이전에는 여러 작은 루프가 컨텍스트에 맞게 약간 다른 방식으로 거의 동일한 방식으로 작업을 수행하는 동안 재귀 방법을 변경하여 코드의 대부분을 중복 제거했습니다. 이제 두 개의 루프가 있습니다-하나는 인쇄물과 하나는 들여 쓰기입니다. 둘 다 동일한 테스트에 의존합니다. 테스트가 통과하면 인쇄 루프가 시작되고 실패하거나 빈 줄에서 시작하면 들여 쓰기 루프가 대신됩니다.
전체 프로세스는 매우 빠르기 때문에 대부분의 경우 /./d
빈 줄이 아닌 행을 생략하고 다음 줄로 넘어갑니다 zshall
. 화면을 즉시 채우는 결과도 있습니다 . 변경되지 않았습니다.
어쨌든 지금까지는 매우 유용합니다. 예를 들어 read
위의 작업은 다음과 같이 수행 할 수 있습니다.
mansed bash read
... 그리고 전체 블록을 얻습니다. 첫 번째는 항상 man
검색해야하는 페이지 이지만 모든 패턴이나 무엇이든 또는 여러 인수를 취할 수 있습니다 . 다음은 내가 한 후의 결과 중 일부 그림입니다 .
mansed bash read printf
... 두 블록 모두가 반환됩니다. 나는 종종 그것을 다음과 같이 사용합니다 :
mansed ksh '[Cc]ommand.*'
... 매우 유용합니다. 또한 얻는 SYNOPS[ES]
것이 정말 편리합니다.
여기에 소용돌이를 주길 원한다면-당신이하지 않으면 나는 당신을 비난하지 않을 것입니다.
mansed() {
MAN_KEEP_FORMATTING=1 man "$1" 2>/dev/null | ( shift
b='[:blank:]' s='[:space:]' bs=$(printf \\b) esc=$(printf '\033\[') n='\
' match=$(printf "\([${b}]*%s[${b}].*\)*" "$@")
sed -n "1p
/\n/!{ /./{ \$p;d
};x; /.*\n/!g;s///;x
:indent
/.*\n\n/{s///;x
};n;\$p;
/^\([^${s}].*\)*$/{s/./ &/;h; b indent
};x; s/.*\n[^-[]*\n.*//; /./!x;t
s/[${s}]*$//; s/\n[${b}]\{2,\}/${n} /;G;h
};
#test
/^\([${b}]*\)\([^${b}].*\n\)\1\([${b}]\)/!b indent
s//\1\2.\3/
:print
/^[${s}]*\n\./{ s///;s/\n\./${n}/
/${bs}/{s/\n/ & /g;
s/\(\(.\)${bs}\2\)\{1,\}/${esc}38;5;35m&${esc}0m/g
s/\(_${bs}[^_]\)\{1,\}/${esc}38;5;75m&${esc}0m/g
s/.${bs}//g;s/ \n /${n}/g
s/\(\(${esc}\)0m\2[^m]*m[_ ]\{,2\}\)\{2\}/_/g
};p;g;N;/\n$/!D
s//./; t print
};
#match
s/\n.*/ /; s/.${bs}//g
s/^\(${match}\).*/${n}\1/
/../{ s/^\([${s}]*\)\(.*\)/\1${n}/
x; s//${n}\1${n}. \2/; P
};D
");}
간단히 말해 워크 플로는 다음과 같습니다.
- 공백이 아니고
\n
ewline 문자를 포함하지 않는 행 은 출력에서 삭제됩니다.
\n
입력 패턴 공간에서 ewline 문자는 절대 발생하지 않습니다. 편집 결과로만 가질 수 있습니다.
:print
및 :indent
모두 상호 의존적 폐쇄 루프이며 얻는 유일한 방법 \n
ewline한다.
:print
행의 선행 문자가 일련의 공백 다음에 \n
ewline 문자 인 경우 루프 순환이 시작됩니다 .
:indent
사이클은 빈 라인에서 시작하거나 :print
실패한 사이클 라인 에서 시작 #test
하지만 출력에서 :indent
모든 선행 공백 + \n
ewline 시퀀스를 제거합니다 .
- 일단
:print
시작하면 입력 라인을 계속 끌어오고, 사이클의 첫 번째 라인에서 찾은 양만큼 선행 공백을 제거하고 오버 스트라이크 및 언더 스트라이크 백 스페이스 이스케이프를 컬러 터미널 이스케이프로 변환 한 다음 #test
실패 할 때까지 결과를 인쇄 합니다.
:indent
시작 하기 전에 먼저 h
가능한 빈 공간이 있는지 (예 : 하위 섹션) 오래된 공간을 확인한 다음 #test
실패하고 첫 번째 줄 뒤의 행이 계속 일치하는 한 계속 입력을 가져옵니다 [-
. 첫 번째 줄 이후의 줄이 해당 패턴과 일치하지 않으면 삭제되고 다음 빈 줄까지 다음 줄도 모두 삭제됩니다.
#match
그리고 #test
두 개의 폐쇄 루프를 해소.
#test
행의 선행 공백이 \n
행 순서에서 마지막 ewline 다음에 오는 시리즈보다 짧을 때 통과 합니다.
#match
모든 명령 행 arg와 일치하는 출력 시퀀스 중 하나에 \n
대한 :print
주기 를 시작하는 데 필요한 선행 ewlines를 추가합니다 :indent
. 비어 있지 않은 시퀀스는 빈 행으로 표시되고 결과 빈 줄은로 다시 전달됩니다 :indent
.