Двоеточие с 'r' в строке не работает должным образом под Zsh - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь запустить код под zsh

a=123
b="$a:r"
echo $b

, который я хочу, чтобы результат был 123:r, но получается

123 # without ":r"

И то же самоевещь для персонажа t, q.

Однако, если я запускаю его под bash, это дает мне желаемый результат 123:r.

Если я добавлю {}, запускает

a=123
b="${a}:r"
echo $b

, что также приносит желаемый результат.

Кто-нибудь знает, что здесь происходит?

1 Ответ

0 голосов
/ 10 апреля 2019

В zsh "$a:r" по умолчанию совпадает с "${a:r}".

Цитировать документацию (выделение добавлено):

${name}

Подставляется значение имени параметра, если оно есть.Скобки требуются, если за расширением следует буква, цифра или знак подчеркивания, которые не следует интерпретировать как часть имени.Кроме того, более сложные формы замещения обычно требуют наличия скобок; Исключения, которые применяются только в том случае, если опция KSH_ARRAYS не установлена, представляют собой отдельный индекс или любые модификаторы двоеточия, появляющиеся после имени , или любой из символов '^', '=', '~', '# 'или' + 'перед именем, все из которых работают со скобками или без них.

Модификатор :r означает :

Удалите расширение файла, оставив корневое имя.Строки без расширения имени файла не изменяются.Расширение имени файла - «.»за которым следует любое количество символов (включая ноль), которые не являются ни «.»ни '/', и это продолжается до конца строки.Например, расширение «foo.orig.c» равно «.c», а «dir.c / foo» не имеет расширения.

Чтобы отключить это поведение:

$ setopt KSH_ARRAYS

(Примечание: выполнение этого в моей настройке фактически приводит к тому, что zsh вызывает segfault; опция меняет поведение несколькими способами, один из которых сильно конфликтует с чем-то в моем .zshrc. Ваши результаты могут отличаться.)

...