Общий подход заключается в отправке объектного файла, содержащего проприетарный код, и «прокладки», предоставляемой в виде исходного кода, который при необходимости перестраивается для соответствующих ядер. Код интерфейса обрабатывает весь интерфейс модуля для ядра, включая импорт символов со строками версий и т. д.
Например, драйверы NVIDIA содержат файл nv-kernel.o
, который предоставляется только в виде двоичного файла и заканчивается в модуле ядра.
Это небольшая проблема с глобусами ksh и zsh. Вы можете использовать фигурные скобки:
echo foo{,/bar}/baz
echo foo{,/*}/baz # you probably don't want this one, see below
Однако фигурные скобки — это не шарики, и достаточно ли они близки, зависит от того, что именно вы делаете.
Основная проблема заключается в том, какие файлы гарантированно существуют и что должно произойти, если некоторые файлы не существуют. foo{,/bar}/baz
расширяется до двух слов foo/baz
и foo/bar/baz
вне зависимости от того, существуют файлы или нет. С подстановочными знаками по умолчанию выдается ошибка foo{,/*}/baz
, если нет файла, соответствующего foo/*/baz
, даже если foo/baz
существует. Вы можете исправить это с помощью флагаN
globbing:
echo foo{/*,}/baz(N)
Это расширяется до списка существующих файлов, соответствующих foo/*/baz
(, даже если этот список пуст ), за которым следует foo/baz
, если он существует. Это эквивалентно тому, что вы получили бы от foo/(*/|)/baz(N)
, если бы это сработало. С другой стороны, нет простого эквивалента того, что foo/(*/|)/baz
сделал бы :, если вы хотите получить ошибку, если нет совпадений, вы должны сделать это самостоятельно, например.
bazes=(foo{,/*}/baz(N))
if (($#bazes == 0)); then echo >&2 "No bazes are belong to us"; return 1; fi
Еще одно различие между фигурными скобками и подстановочными фигурами заключается в том, что порядок в фигурных скобках определяет порядок раскрытия. Например, echo foo{,/*}/baz(Nom)
всегда ставит foo/baz
первым, независимо от времени его модификации.
Вы явно не указали, хотите ли вы совпадающие файлы в этих двух местах только или все из них в дереве. Если есть возможность сопоставить их все, вы можете использовать**
:
% mkdir -p foo/{bar,asdf/asdf,}/baz
% echo foo/**/baz
foo/asdf/asdf/baz foo/bar/baz foo/baz
это работает и в Bash (с включенным globstar
):
$ shopt -s globstar
$ echo foo/**/baz
foo/asdf/asdf/baz foo/bar/baz foo/baz
(Есть некоторые оговорки/различия между **
на zsh и Bash wrt. символические ссылки в дереве.)