Как с помощью подстановки zsh указать, что компонент пути является необязательным?

Общий подход заключается в отправке объектного файла, содержащего проприетарный код, и «прокладки», предоставляемой в виде исходного кода, который при необходимости перестраивается для соответствующих ядер. Код интерфейса обрабатывает весь интерфейс модуля для ядра, включая импорт символов со строками версий и т. д.

Например, драйверы NVIDIA содержат файл nv-kernel.o, который предоставляется только в виде двоичного файла и заканчивается в модуле ядра.

2
23.09.2021, 00:38
2 ответа

Это небольшая проблема с глобусами 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существует. Вы можете исправить это с помощью флагаNglobbing:

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первым, независимо от времени его модификации.

2
23.09.2021, 11:10

Вы явно не указали, хотите ли вы совпадающие файлы в этих двух местах только или все из них в дереве. Если есть возможность сопоставить их все, вы можете использовать**:

% 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. символические ссылки в дереве.)

0
23.09.2021, 11:17

Теги

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