bash
80 년대 후반에 ksh
csh / tcsh의 일부 대화식 기능 을 갖춘 부분 복제본으로 설계되었습니다 .
globbing의 기원은 그것이 형성되는 초기 껍질에서 찾아야합니다.
ksh
그 자체는 Bourne 쉘의 확장입니다. Bourne 쉘 자체 (1979 년 Unix V7에서 처음 릴리스 됨)는 처음부터 완전히 구현되었지만 Thompson 쉘 (V1-> V6의 쉘)에서 완전히 벗어나지 않고 Mashey 쉘의 기능을 통합했습니다.
특히, 명령 인수가 여전히 공백으로 분리되었다가 |
이제 새로운 파이프 연산자했지만 ^
여전히 대안으로 지원 (그리고 당신이 이유를 설명 [!a-z]
하지 [^a-z]
), $1
여전히 스크립트에 첫 번째 인수했다 및 백 슬래시는 여전히 이스케이프 문자였다 . 많은 정규 표현식 연산자 ( ^\|$
)는 쉘에서 자체적으로 특별한 의미를 갖습니다.
Thompson 쉘은 globbing을 위해 외부 유틸리티를 사용했습니다. 때 sh
인용 부호가 발견 *
, [
또는 ?
명령에이야, 그것은을 통해 명령을 실행할 것입니다 glob
.
rm *.txt
다음과 같이 glob가 실행됩니다.
["glob", "rm", "*.txt"]
glob는 rm
해당 패턴과 일치하는 파일 목록으로 실행 됩니다.
grep a.\*b *.txt
다음 glob
과 같이 실행 됩니다.
["glob", "grep", "a.\252b", "*.txt"]
*
위 의 내용은 해당 문자에 8 번째 비트를 설정하여 인용 glob
하여 와일드 카드로 취급하지 않도록 합니다. glob
그런 다음 호출하기 전에 해당 비트를 제거합니다 grep
.
정규 표현식과 동등한 작업을 수행하려면 다음과 같습니다.
regexp rm '\.txt$'
또는:
regexp rm '^[^.].*\.txt$'
도트 파일을 제외합니다.
셸 특수 문자로 두 배로 증가함에 따라 연산자를 이스케이프 처리해야합니다 .
. 파일 이름에서 일반적으로 사용되는 정규 표현식 연산자는 파일 이름을 일치시키는 데 적합하지 않으며 초보자에게는 복잡하지 않습니다. 대부분의 경우 하나 ( ) 또는 임의의 수 ( )의 문자를 대체 할 수있는 와일드 카드 만?
있으면 *
됩니다.
이제 다른 쉘은 다른 글러브 연산자를 추가했습니다. 오늘날 ksh 및 zsh glob (및 bash -O extglob
ksh globs의 하위 집합을 구현하는 정도 )은 파일 이름 및 현재 셸 구문과 함께 사용하기에 덜 성가신 구문을 사용하여 정규 표현식과 기능적으로 동일합니다. 예를 들어 zsh
(확장 글로브 확장)에서 다음을 수행 할 수 있습니다.
echo a#.txt
당신이 원하는 경우 (가능성)의 순서로 구성 파일 이름에 맞게 a
다음을 .txt
. echo (^a*\.txt$)
(여기서 쉘이 처리 할 수있는 한 가지 방법 일 수있는 쉘 연산자로부터 정규식 연산자를 분리하는 방법으로 중괄호를 사용하는 것)보다 쉽습니다 .
echo (foo|bar|<1-20>).(#i)mpg
기본 이름이 foo, bar 또는 1에서 20까지의 10 진수 인 mpg 파일 (대소 문자 구분 안 함)의 경우 ...
ksh93
이제는 버그에 정규 표현식 (기본, 확장, 펄 유사 또는 "확장")을 통합 할 수 있으며 (글로벌 버그이지만) glob와 regexp ( printf %R
, printf %P
) 사이를 변환하는 도구를 제공합니다 .
echo ~(Ei:.*\.txt)
와 파일이 txt 일치로 (숨겨지지 않은) E는 , 정규 표현식을 xtended 문자를 구분 전을 nsensitively.
rm -- ^[^.].*\.txt$
대신에rm -- *.txt
?