Конечно, это может. В зависимости от Ваших определенных потребностей необходимо рассмотреть несколько вещей:
Править: Если просто необходимо выполнить контрольную станцию, то распределение, вероятно, не имеет значения так очень. Вы могли бы хотеть выполнить его отдельно от других процессов, хотя, посмотрите, например, приоритет управления приложений с помощью cgroups для некоторых подсказок; материал рабочей станции может быть помещен, например, в отдельном LXC.
Для прямого управления периферийными устройствами (чтобы мне не походит на DCS вообще), Вы, возможно, должны выполнить его на ядре в реальном времени для гарантии скорости отклика для процесса (процессов) управления.
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.
Историческая причина: ДА. Ссылка:
http://en.wikipedia.org/wiki/Glob_(программирование)#Origin
Просто чтобы показать расхождение, вот хороший и простой пример: a*
a
, а затем что бы там ни было (a, ab, abca...)a
(a, aa, aaa...).Я с готовностью соглашусь, что это несоответствие по смыслу очень запутано для новых пользователей.
Глобус, возможно, легче понять для новичков, но и менее мощная конструкция.
Регулярные языки были введены Клини в 1956 году. В основополагающей статье не было полной современной нотации для регулярных выражений, но она вводила «Клини звезда »: A *
, что означает« любое количество повторений A
». В следующем десятилетии появились более или менее стандартные обозначения, в частности .
для произвольного символа и ?
, чтобы означать, что предыдущий символ является необязательным.
Нотация подстановки в Баше происходит от команды glob
, введенной еще в Unix v1 в 1971 году. В то время подстановка выполнялась отдельной программой; позже он был перемещен в оболочку. Ранняя команда glob
содержит ?
для обозначения «любого одного символа» и *
для обозначения «любой последовательности символов». Я не знаю, почему были выбраны персонажи; ?
довольно интуитивно понятен, а *
, возможно, был основан на использовании регулярных выражений.
Глобализация не должна была быть такой же общей, как регулярные выражения, а регулярные выражения в то время не были широко распространены, поэтому не было необходимости унифицировать концепции. С самого начала была синтаксическая несовместимость с ?
, .
и *
означают разные вещи в шаблонах имен файлов и в регулярных выражениях.
Современные оболочки, такие как bash, расширяют шаблоны глобусов, но это была постепенная эволюция с сохранением обратной совместимости. Ksh88 (версия оболочки Korn 1988 года) представил расширенный синтаксис для шаблонов оболочки, который не мог иметь тот же синтаксис, что и обычные регулярные выражения, но был сильно вдохновлен им: * (PATTERN)
для обозначения любого количества повторений ШАБЛОН
, @ (ШАБЛОН1 | ШАБЛОН2)
для обозначения « ШАБЛОН1
или ШАБЛОН2
» и т. Д. .
Современные версии bash (начиная с 2.02) поддерживают расширенные шаблоны ksh88, если вы сначала выполните shopt -s extglob
.