Linux에서는 모든 엔터티가 파일로 처리됩니다. 이렇게 하면 vim <cd-Name>
파일 vim
과 디렉터리를 구분하지 않기 때문에 디렉터리 내용이 편집기에서 열립니다.
그런데 오늘 작업을 하다가 정말 궁금했던 점을 발견했습니다.
중첩된 디렉터리에서 파일을 열 계획입니다.
vim a/b/c/d/file
하지만 vim
난 들어가지 않았어
cd a/b/c/d/
두 번 클릭했지만 TAB명령은 파일 대신 "d" 디렉터리의 사용 가능한 디렉터리만 표시합니다.
명령 불복종 cd
”모든 것이 파일이다"? 아니면 뭔가 빠졌나요?
답변1
이것"모든 것이 파일이다"이 문장은 운영 체제의 아키텍처를 정의합니다. 이는 시스템의 모든 것(프로세스, 파일, 디렉터리, 소켓, 파이프...)이 추상화된 파일 설명자로 표현된다는 것을 의미합니다.가상 파일 시스템커널 레이어. 가상 파일 시스템은 커널이 제공하는 인터페이스입니다. 따라서 해당 문구는 "로 수정되었습니다.모든 것은 파일 설명자입니다". Linus Torvalds 자신이 이를 좀 더 정확하게 수정했습니다. "모든 것은 바이트 스트림이다".
그러나 각 "파일"에는 일반 파일 및 디렉터리에서 알 수 있는 소유자와 권한도 있습니다. 따라서 cat, ls, ps 등과 같은 고전적인 Unix 도구는 이러한 모든 "파일"을 쿼리할 수 있으며 다른 특별한 메커니즘을 개발할 필요가 없으며 read()
시스템 호출을 사용하는 일반 오래된 도구만 있으면 됩니다. 예를 들어 Microsoft의 운영 체제 제품군에는 read()
모든 파일 형식에 대해 여러 가지 시스템 호출이 있으며(약 15개 정도라고 들었습니다) 각 시스템 호출은 조금씩 다릅니다. 모든 것이 파일이면 필요하지 않습니다.
귀하의 질문에 대한: 물론 다른 파일도 있습니다유형. 리눅스에는7가지 파일 형식. 디렉토리가 그 중 하나입니다. 그러나 유틸리티는 이를 서로 구별할 수 있습니다. 예를 들어, cd
명령의 전체 기능( 을 누르면 )은 시스템 호출( 참조 )이 이름이 지정된 필드가 있는 구조를 반환 TAB하기 때문에 디렉토리만 나열합니다 . POSIX 표준은 이 필드에 포함될 수 있는 내용을 정의합니다.stat()
man 2 stat
st_mode
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
명령 cd
완성 기능은 플래그가 설정된 "파일"만 표시합니다 S_ISDIR
.
답변2
cd
여러분의 쉘은 파일 인수와 함께 작동하지 않는다는 것을 알 만큼 똑똑합니다 . 따라서 클릭하면 tab
해당 내용만 표시됩니다 cd
.
답변3
cd
완성bash
은TAB
bash 옵션에 의해 제어되며 및/usr/share/bash-completion/bash_completion
에서 다양한 완성 스크립트를 찾을 수 있습니다/etc/bash_completion.d
.cd
완료 방법은 이전 방법에서 정의되었습니다. 디렉터리에 대해서만 작동 하므로cd
사용 가능한 디렉터리만 나열하는 것이 당연합니다.Linux의 모든 것은 파일입니다.