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

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

아래 회의록을 참조하세요:

$ 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/ramf/ram/file

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

답변1

~에서배쉬 매뉴얼:

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

따라서 확장 후 패턴을 식별하고 교체하는 과정이 아닙니다. 대신 먼저 패턴을 파악하고 부품을 교체한 다음그 다음에확장되었습니다. 에서는 ${f/$PAT}전체가 $PAT패턴이 되고 아무것도 대체되지 않는다.

관련 정보