bashСпочатку був розроблений в кінці 80-х років як частковий клон kshз деякими інтерактивними особливостями від csh / tcsh.
Витоки глобалізації повинні бути знайдені в тих ранніх оболонках, на яких він будується.
kshсама по собі є розширенням оболонки Борна. Сама оболонка Bourne (вперше випущена в 1979 році в Unix V7) була чистою реалізацією з нуля, але вона не відійшла повністю від оболонки Томпсона (оболонка V1 -> V6) і включала функції шкаралупи Машея.
Зокрема, аргументи команд все ще були розділені пробілами, |тепер це новий оператор труби, але ^він як і раніше підтримується як альтернатива (а також пояснює, чому ви це робите, [!a-z]а ні [^a-z]), $1все ж був першим аргументом до сценарію, а зворотний косий рисок все ще був символом втечі . Так багато операторів regexp ( ^\|$) мають спеціальне значення в оболонці.
Оболонка Томпсона спиралася на зовнішню утиліту для глобалізації. Якщо його shзнайдуть без котирування *, [або ?s в команді, воно запустить команду через glob.
rm *.txt
в кінцевому підсумку працює глобус як:
["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 (і певною мірою, bash -O extglobщо реалізує підмножину ksh globs) функціонально еквівалентні регулярним виразкам із синтаксисом, який є менш громіздким для використання з назви файлів та поточним синтаксисом оболонки. Наприклад, у zsh(із розширенням розширення глоб) ви можете:
echo a#.txt
якщо ви хочете (навряд чи) відповідати назви файлів, які складаються з послідовностей, за якими aслід .txt. Простіше, ніж echo (^a*\.txt$)(тут використовується дужки як спосіб ізоляції операторів регулярних виразів від операторів оболонки, які могли бути одним із способів, як оболонки могли з цим впоратися).
echo (foo|bar|<1-20>).(#i)mpg
Для mpg-файлів (нечутливих до регістру), основна назва яких - foo, bar або десяткове число від 1 до 20 ...
ksh93тепер також може включати в свої кулі regexps (базовий, розширений, схожий на perl або "доповнений") (хоча це досить баггі) і навіть надає інструмент для перетворення між glob і regexp ( printf %R, printf %P):
echo ~(Ei:.*\.txt)
в матч (не приховати) TXT файлів з E Xtended регулярних виразів, до регістру I nsensitively.
rm -- ^[^.].*\.txt$замість цього зробитиrm -- *.txt?