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
?