![bash가 .*를 현재 디렉터리의 숨겨진 파일 목록으로 변환하는 이유는 무엇이며 그렇게 하지 않도록 방지하는 방법은 무엇입니까?](https://linux55.com/image/135178/bash%EA%B0%80%20.*%EB%A5%BC%20%ED%98%84%EC%9E%AC%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%9D%98%20%EC%88%A8%EA%B2%A8%EC%A7%84%20%ED%8C%8C%EC%9D%BC%20%EB%AA%A9%EB%A1%9D%EC%9C%BC%EB%A1%9C%20%EB%B3%80%ED%99%98%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0%20%EA%B7%B8%EB%A0%87%EA%B2%8C%20%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8F%84%EB%A1%9D%20%EB%B0%A9%EC%A7%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
# 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=(".*")
.