이것bash-5.0 매뉴얼섹션 3.5.8에서는 다음을 지정합니다.
단어 분리 후 Bash는 -f 옵션이 설정되지 않은 경우 각 단어에서 '*', '?' 및 '[' 문자를 검색합니다(내장 설정 참조). 이러한 문자 중 하나가 발생하면 해당 단어는 패턴으로 처리되고 패턴과 일치하는 파일 이름의 알파벳순 목록으로 대체됩니다(패턴 일치 참조). 일치하는 파일 이름이 없고 쉘 옵션 nullglob이 비활성화된 경우 단어는 변경되지 않고 그대로 유지됩니다. nullglob 옵션이 설정되어 있고 일치하는 항목이 없으면 해당 단어가 제거됩니다.
그러나 내 셸에서는 nullglob
다음과 같은 상황에서 활성화하면 파일 이름 확장도 시작되는 것 같습니다.
$ echo ${BASH_VERSION}
5.0.0(1)-release
$ shopt -s nullglob
$ FOO="/home/smith"
$ echo ${FOO//\//\\\/}
$ echo "${FOO//\//\\\/}"
\/home\/smith
흥미롭게도 이전 bash 버전을 사용하면 다른 동작이 발생합니다.
$ echo ${BASH_VERSION}
4.3.30(1)-release
$ shopt -s nullglob
$ FOO="/home/smith"
$ echo ${FOO//\//\\\/}
\/home\/smith
$ echo "${FOO//\//\\\/}"
\/home\/smith
질문
파일 이름 확장이 발생할 것으로 예상하지 않습니다. echo ${FOO//\//\\\/}
bash 5.0이 아무것도 인쇄하지 않는 이유를 설명할 수 있습니까 ?
답변1
실제로 더 많은 조사를 거쳐 이것이 나중에 복원된 것으로 밝혀졌습니다.v5.1-alpha
.
$ echo ${BASH_VERSION}
5.1.0(1)-alpha
$ shopt -s nullglob
$ FOO="/home/smith"
$ echo ${FOO//\//\\\/}
\/home\/smith
$ echo "${FOO//\//\\\/}"
\/home\/smith
개인적으로 기대되는 점입니다.
이는 또한 다양한 경우를 해결하는 것으로 보입니다(이를 지적한 Stéphane에게 감사드립니다).
$ echo ${BASH_VERSION}
5.1.0(1)-alpha
$ a='/\x' bash -O nullglob -c 'echo $a'
/\x