# 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=(".*")
.