История Bash globbing

Конечно, это может. В зависимости от Ваших определенных потребностей необходимо рассмотреть несколько вещей:

  • Вам будет нужен какой-либо вид поддержки, или Вы сможете и разрешены (в конечном счете) заботиться о технических вещах сами? Для чего-либо производство градуирует распределение "предприятия" с поддержкой, кажется, более оптимальный вариант.
  • на какой архитектуре необходимо работать? - x86, PowerPC, MIPS, SPARC, ARM, AVR...?
  • Вам будет нужно что-либо по крайней мере удаленно в реальном времени? В этом случае ищите ядро в реальном времени.
  • Вам будет нужна своего рода виртуализация?

Править: Если просто необходимо выполнить контрольную станцию, то распределение, вероятно, не имеет значения так очень. Вы могли бы хотеть выполнить его отдельно от других процессов, хотя, посмотрите, например, приоритет управления приложений с помощью cgroups для некоторых подсказок; материал рабочей станции может быть помещен, например, в отдельном LXC.

Для прямого управления периферийными устройствами (чтобы мне не походит на DCS вообще), Вы, возможно, должны выполнить его на ядре в реальном времени для гарантии скорости отклика для процесса (процессов) управления.

11
11.06.2014, 01:53
3 ответа

bash изначально был разработан в конце 80-х как частичный клон ksh с некоторыми интерактивными функциями из csh / tcsh.

Истоки глобббинга следует искать в тех более ранних оболочках, на которых оно построено.

ksh сам по себе является расширением оболочки Борна. Сама оболочка Bourne (впервые выпущенная в 1979 году в Unix V7) была чистой реализацией с нуля, но она не отходила полностью от оболочки Thompson (оболочка V1 -> V6) и включала функции оболочки Mashey.

В частности, аргументы команд по-прежнему разделялись пробелами, | теперь был новым оператором канала, но ^ по-прежнему поддерживался в качестве альтернативы (а также объясняет, почему вы делаете ] [! az] , а не [^ az] ), $ 1 по-прежнему был первым аргументом сценария, а обратная косая черта по-прежнему была escape-символом. Так что многие операторы регулярного выражения ( ^ \ | $ ) имеют собственное особое значение в оболочке.

Оболочка Томпсона полагалась на внешнюю утилиту для подстановки. Когда 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 (и в некоторой степени bash -O extglob , который реализует подмножество глобусов ksh) функционально эквивалентны регулярным выражениям с синтаксисом, который менее громоздок для использования с именами файлов и текущей оболочкой. синтаксис. Например, в zsh (с расширением extendedglob) вы можете сделать:

echo a#.txt

, если вы хотите (что маловероятно) сопоставить имена файлов, состоящие из последовательностей a , за которыми следует .txt . Проще, чем echo (^ a * \. Txt $) (здесь используются фигурные скобки как способ изолировать операторы регулярных выражений от операторов оболочки, которые могли бы быть одним из способов, которыми оболочки могли бы справиться с этим).

echo (foo|bar|<1-20>).(#i)mpg

Для файлов mpg (без учета регистра), базовое имя которых - foo, bar или десятичное число от 1 до 20 ...

ksh93 теперь также может включать регулярные выражения (базовый, расширенный, Perl-подобный или «расширенный») в его глобах (хотя он довольно глючный) и даже предоставляет инструмент для преобразования между глобусом и регулярным выражением ( printf% R , printf% P ):

echo ~(Ei:.*\.txt)

для сопоставления (не скрытых) текстовых файлов с регулярными выражениями E xtended, case- i nsensitively.

12
27.01.2020, 19:57

Историческая причина: ДА. Ссылка:
http://en.wikipedia.org/wiki/Glob_(программирование)#Origin

Просто чтобы показать расхождение, вот хороший и простой пример: a*

  • shell globbing: смысл в том, что первый символ - это a, а затем что бы там ни было (a, ab, abca...)
  • regex: смысл в том, что нуль или больше повторений символа a (a, aa, aaa...).

Я с готовностью соглашусь, что это несоответствие по смыслу очень запутано для новых пользователей.

Глобус, возможно, легче понять для новичков, но и менее мощная конструкция.

1
27.01.2020, 19:57

Регулярные языки были введены Клини в 1956 году. В основополагающей статье не было полной современной нотации для регулярных выражений, но она вводила «Клини звезда »: A * , что означает« любое количество повторений A ». В следующем десятилетии появились более или менее стандартные обозначения, в частности . для произвольного символа и ? , чтобы означать, что предыдущий символ является необязательным.

Нотация подстановки в Баше происходит от команды glob , введенной еще в Unix v1 в 1971 году. В то время подстановка выполнялась отдельной программой; позже он был перемещен в оболочку. Ранняя команда glob содержит ? для обозначения «любого одного символа» и * для обозначения «любой последовательности символов». Я не знаю, почему были выбраны персонажи; ? довольно интуитивно понятен, а * , возможно, был основан на использовании регулярных выражений.

Глобализация не должна была быть такой же общей, как регулярные выражения, а регулярные выражения в то время не были широко распространены, поэтому не было необходимости унифицировать концепции. С самого начала была синтаксическая несовместимость с ? , . и * означают разные вещи в шаблонах имен файлов и в регулярных выражениях.

Современные оболочки, такие как bash, расширяют шаблоны глобусов, но это была постепенная эволюция с сохранением обратной совместимости. Ksh88 (версия оболочки Korn 1988 года) представил расширенный синтаксис для шаблонов оболочки, который не мог иметь тот же синтаксис, что и обычные регулярные выражения, но был сильно вдохновлен им: * (PATTERN) для обозначения любого количества повторений ШАБЛОН , @ (ШАБЛОН1 | ШАБЛОН2) для обозначения « ШАБЛОН1 или ШАБЛОН2 » и т. Д. .

Современные версии bash (начиная с 2.02) поддерживают расширенные шаблоны ksh88, если вы сначала выполните shopt -s extglob .

9
27.01.2020, 19:57

Теги

Похожие вопросы