Вы ищете что-то вроде
grep -q '+1' file && echo found
Или, возможно,
[[ $foo =~ '+1' ]] && echo found
Следующий фрагмент приводит к завершению mcd
какmkdir
:
compdefas () {
if (($+_comps[$1])); then
compdef $_comps[$1] ${^@[2,-1]}=$1
fi
}
compdefas mkdir mcd
Это работает, чтобы найти текущую настройку завершения для mkdir
. Код завершения для функции (обычно имя функции завершения )хранится в ассоциативном массиве _comps
. Таким образом, compdef $_comps[mkdir] mcd
объявляет, что mcd
должно быть завершено так же, как mkdir
завершено прямо сейчас.
Функция выше добавляет несколько тонкостей:
(($+_comps[$1]))
гарантирует, что если $1
не имеет указанного метода завершения, то для других аргументов метод завершения не задан. ${@[2,-1]}
— это список аргументов функции, начиная со второго, поэтому вы можете указать более одного имени команды для определения завершения. На самом деле это ${^@[a,-1]}
, так что текст вокруг расширения массива реплицируется для каждого элемента массива . =$1
устанавливает имя службы для использования . Это имеет значение только для нескольких команд, функция завершения которых обрабатывает несколько тесно -связанных команд. Например, функция завершения _gzip
обрабатывает как gzip
и gunzip
, так и pigz
и unpigz
; compdef _gzip foo
заставляет foo
использовать поведение _gzip
по умолчанию, а compdef _gzip foo=pigz
заставляет foo
использовать поведение _gzip
после завершения для pigz
. Обращаясь к вашему конкретному случаю, завершение по умолчанию для mkdir
предлагает не только каталоги, но и опции, которые ваша функция не поддерживает. Так что на самом деле вам лучше определить mcd
как просто заполнение существующих каталогов. Zsh поставляется со вспомогательной функцией для (недокументированной оболочки вокруг_files
).
compdef _directories mcd
Причина, по которой вы получали эти причудливые -варианты завершения для mcd
, заключается в том, что это имя команды из когда-то умеренно распространенного набора команд mtools .
compdef
использует следующую форму:
compdef [ -ane ] function name
, поэтому одной из идей было бы указать name
из mcd
на функцию _mkdir
с помощью следующей команды:
compdef _mkdir mcd
однако это немного неверно, так как mkdir
дополняет различные флаги, которые, вероятно, не следует также указывать для cd
. Более прямым было бы завершение каталогов:
compdef _directories mcd