"ls *bash*"가 .bashrc 파일을 표시하지 않는 이유

"ls *bash*"가 .bashrc 파일을 표시하지 않는 이유

내 홈 디렉토리로 CD를 이동하고 다음을 입력합니다.

ls *bash*

"bash"가 포함된 파일 목록이 표시될 것으로 예상됩니다. 그러나 그렇지 않습니다.

그러는 동안 타이핑을 하다가

ls .bash*

일하다.

문서에 따르면 는 *모든 문자를 나타냅니다. 그렇죠? 하지만 .이 경우는 그렇지 않은 것 같습니다. 뭐가 문제 야?

답변1

dotglob옵션은 다음을 제어합니다.

$ shopt -s dotglob
$ ls *bash*
.bash_history  .bash_logout  .bashrc

대부분의 최종 사용자는 도트 파일에 대해 걱정할 필요가 없고 중요한 홈 디렉토리 파일(예: .config) 을 실수로 삭제하기 쉬울 수 있으므로 기본적으로는 사용성/보안 조치로 활성화되어 있지 않습니다 .ssh.

답변2

대부분의 쉘은 "."로 시작하는 "*" 문자와 일치하지 않습니다. 역사적인 이유로 문자(예: "."로 시작하는 파일은 숨겨진 것으로 간주되고 "." 및 ".."는 디렉터리를 나타냄)

따라서 ls.bashrc는 표시되지 않지만 ls -a모든 파일은 표시됩니다. 마찬가지로 ls *"."으로 시작하는 파일을 제외한 모든 파일이 확장됩니다. 특징.

shopt -s dotglob"*"도 선행 "." 문자와 일치해야 한다고 bash에 알리려면 이 동작을 변경하세요 . 그 후에는 ls *.bashrc도 표시됩니다.

답변3

*그 이유는 선행 점이 "파일 숨기기"에 대한 규칙이고 파일 와일드카드( "임의의 모든 문자" 및 ?"임의의 한 문자" 및 기타 몇 가지 문자 의 이름)가 명시적으로 선행 점을 제외하기 때문입니다. "문서 숨기기"를 의미하기 때문입니다.

작성하면 ls -l .*일치 하지만 특수 숨겨진 파일 및 디렉터리 .bashrc도 일치하므로 숨겨진 파일을 표시하려면 다음이 필요합니다....

  • ls -ld .*
  • ls -l .[^.]*
  • ls -A | grep bash

ls -A *bash*이 옵션이 적용되기 전에 .bashrc파일 일치가 완료되었으므로 표시되지 않습니다 .-A

파일 와일드카드가 숨겨진 파일을 처리하는 방식을 변경하려면 shopt -s dotglob셸에서 테스트하거나 .bash_profile 또는 .bashrc에 넣어 항상 작동하도록 하면 됩니다.

관련 정보