bash가 .*를 현재 디렉터리의 숨겨진 파일 목록으로 변환하는 이유는 무엇이며 그렇게 하지 않도록 방지하는 방법은 무엇입니까?

bash가 .*를 현재 디렉터리의 숨겨진 파일 목록으로 변환하는 이유는 무엇이며 그렇게 하지 않도록 방지하는 방법은 무엇입니까?
# list=(`echo ".*"`)
# for item in ${list[@]}; do echo "$item"; done;
.
..
.DS_Store
.git
.gitignore
.tox
.toxrc

위의 코드에서는 bash의 배열에 문자열을 쓰려고 하는데 .*그렇게 하면 ".*"가 현재 디렉터리에 있는 파일/디렉터리의 전체 목록으로 변환됩니다. Bash가 이 작업을 수행하는 것을 어떻게 막을 수 있나요?

답변1

list=(`echo ".*"`)

위에서는 명령 대체에 따옴표가 없으므로 생성된 출력에는 단어 분리 및 와일드카드가 적용됩니다.

for item in ${list[@]}; do echo "$item"; done;

${list[@]}또한 여기에는 따옴표 가 없으므로다시, 이는 단어 분할 및 와일드카드의 영향을 받습니다. (작업에 따옴표를 추가하거나 일치하는 파일 이름에 공백이나 와일드카드가 포함되어 있는 경우 중요합니다...)

리터럴 문자열만 원할 경우 and를 .*사용하세요 . 명령 대체를 사용하려면 주위에 따옴표를 넣으십시오(예: ) .list=(".*")for item in "${list[@]}"; ..."$(somecmd)"

또한보십시오:

답변2

~에서man bash, 옵션 아래 set:

-f      Disable pathname expansion.

그래서 질문은

set -f

와일드카드를 비활성화한 다음

set +f

일반적인 글로빙 동작을 다시 활성화합니다.


매뉴얼 페이지에서 약간 더 긴 관련 발췌문:

경로명 확장

분사 뒤에, 그렇지 않으면-에프옵션이 설정되어 있고,세게 때리다각 단어의 문자*를 스캔하고,?, 그리고[. 이러한 문자 중 하나가 발생하면 해당 단어는 패턴으로 처리되고 패턴과 일치하는 파일 이름의 알파벳순 목록으로 대체됩니다.

답변3

백틱 부분은 echo …(따옴표가 없는) 문자열을 생성하며 .*, 이후 BASH에 의해 확장됩니다. ".*"가 파일 목록으로 확장되는 것을 원하지 않으면 list=(".*").

관련 정보