¿Por qué la sustitución de patrones no funciona a partir de una sola variable?

¿Por qué la sustitución de patrones no funciona a partir de una sola variable?

Consulte la siguiente transcripción de la sesión:

$ 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

¿Por qué funciona la sustitución de patrones si proporciono SRCy TGTcomo variables separadas y no si las proporciono como una única variable PAT?

Tengo entendido que las sustituciones se procesan de adentro hacia afuera, por lo que la cadena dentro del conjunto externo de llaves, es decir, f/$SRC/$TGTo f/$PATdebe procesarse igualmente para f/file/ramo f/ram/file, que luego se procesa nuevamente para dar el nuevo nombre de archivo real. Pero al parecer esto no se hace así…

Estoy usando Bash 4.4.18 en Kubuntu Bionic LTS con las últimas actualizaciones.

Respuesta1

Deel manual de bash:

${parameter/pattern/string}
Se patternexpande para producir un patrón tal como en la expansión del nombre de archivo. [...] Si stringes nulo, las coincidencias de patternse eliminan y /se puede omitir el siguiente patrón.

Por lo tanto, el proceso no es tal que el patrón y el reemplazo se determinen después de la expansión. En cambio, primero se identifican el patrón y los componentes de reemplazo, yentoncesestán ampliados. En ${f/$PAT}, la totalidad de $PATse convierte en el patrón y el reemplazo está vacío.

información relacionada