단일 변수에서 패턴 대체가 작동하지 않는 이유는 무엇입니까?

단일 변수에서 패턴 대체가 작동하지 않는 이유는 무엇입니까?

아래 세션 기록을 참조하세요.

$ 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

SRCTGT를 단일 변수로 제공하는 경우가 아닌 별도의 변수로 제공하는 경우 패턴 대체가 작동하는 이유는 무엇입니까 PAT?

내가 이해한 바에 따르면 대체는 내부에서 처리되므로 외부 중괄호 세트 내의 문자열(예: or )은 or 와 동일하게 처리되어야 하며 f/$SRC/$TGT, 그런 다음 실제 새 파일 이름을 제공하기 위해 다시 처리됩니다. 하지만 분명히 그렇게되지는 않습니다…f/$PATf/file/ramf/ram/file

최신 업데이트가 포함된 Kubuntu Bionic LTS에서 Bash 4.4.18을 사용하고 있습니다.

답변1

에서배쉬 매뉴얼:

${parameter/pattern/string}
pattern파일 이름 확장과 마찬가지로 패턴을 생성하도록 확장됩니다 . [...] stringnull인 경우 일치 항목이 pattern삭제되고 /다음 패턴이 생략될 수 있습니다.

따라서 확장 후에 패턴과 교체가 결정되는 과정은 아닙니다. 대신, 먼저 패턴과 교체 구성 요소를 식별하고그 다음에그들은 확장되었습니다. 에서는 ${f/$PAT}전체가 $PAT패턴이 되고 교체는 비어 있습니다.

관련 정보