Почему подстановка шаблона не работает с одной переменной?

Почему подстановка шаблона не работает с одной переменной?

Пожалуйста, ознакомьтесь с нижеприведенной стенограммой сессии:

$ mkdir temp
$ cd temp/
$ touch file{1..5}
$ ls
file1  file2  file3  file4  file5
$ SRC=file; TGT=ram
$ for f in file* ; do mv $f ${f/$SRC/$TGT} ; done
$ ls
ram1  ram2  ram3  ram4  ram5
$ PAT=ram/file
$ for f in ram* ; do mv $f ${f/$PAT} ; done
mv: 'ram1' and 'ram1' are the same file
mv: 'ram2' and 'ram2' are the same file
mv: 'ram3' and 'ram3' are the same file
mv: 'ram4' and 'ram4' are the same file
mv: 'ram5' and 'ram5' are the same file

Почему подстановка шаблона работает, если я предоставляю SRCи TGTкак отдельные переменные, и не работает, если я предоставляю их как одну переменную PAT?

Я понимаю, что подстановки обрабатываются изнутри наружу, и поэтому строка внутри внешнего набора фигурных скобок, то есть f/$SRC/$TGTили f/$PATдолжна быть одинаково обработана до f/file/ramили f/ram/file, который затем снова обрабатывается, чтобы дать фактическое новое имя файла. Но, по-видимому, это не так…

Я использую Bash 4.4.18 на Kubuntu Bionic LTS с последними обновлениями.

решение1

Отруководство по Bash:

${parameter/pattern/string}
Расширяется patternдля создания шаблона, как и при расширении имени файла. [...] Если stringравно null, совпадения patternудаляются, а /следующий шаблон может быть опущен.

Итак, процесс не такой, что шаблон и замена определяются после расширения. Вместо этого сначала определяются шаблон и компоненты замены, изатемони расширены. В ${f/$PAT}, все $PATстановится шаблоном, а замена пуста.

Связанный контент