команда -v возвращает неверный результат после перезаписи как функции

Предположим, у вас есть следующие файлы :foo.abc, bar.abc, qux.ghi. В bash тело цикла выполняется четыре раза :с foo.abc, bar.abc,*.def(с литералом*qux.ghi. В zsh с параметрами по умолчанию цикл вообще не выполняется, вместо этого вы получаете ошибку

zsh:1: no matches found: *.def

Чтобы избежать запуска цикла с нерасширенным шаблоном подстановочных знаков и запустить цикл с существующими файлами (, если таковые имеются ), добавьте квалификаторNglob .

for file in *.{abc,def,ghi}(N); do …

Вы также можете использовать оператор|, чтобы иметь один паттерн вместо нескольких паттернов. (Фигурные скобки не являются шаблоном с подстановочными знаками, это просто буквальное расширение строки, которое происходит до анализа подстановочных знаков, т. е. *.{abc,def,ghi}(N)— это просто сокращение для*.abc(N) *.def(N) *.ghi(N))

for file in *.(abc|def|ghi)(N); do …

Обратите внимание, что вам по-прежнему нужен квалификатор Nglob, иначе вы получите сообщение об ошибке, если ни один файл не соответствует.

Вместо использования квалификатора Nglob можно включить параметр null_glob(setopt null_glob). Это часто имеет смысл в сценариях. Обратите внимание, что в bash вам нужно будет активировать аналогичную опцию (shopt -s nullglob), чтобы избежать запуска тела цикла на нерасширенных шаблонах.

0
01.11.2020, 08:09
1 ответ

How can I make command -v return the correct path

Вы не можете. Если вам нужен полный путь, используйте which. Однако я не думаю, что вам нужен этот полный путь. Просто позвоните

command git...

без флага -v. У флага нет интуитивного поведения, и он не выводит того, что сделал бы commandбез флага.

But, if I use which instead, even after overwriting git as function, it returns the correct path.

which— внешняя программа. Он не знает функций bash. commandявляется встроенным.

3
18.03.2021, 22:53

Теги

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