편집 : 이것은 /programming/998626/meaning-of-tilde-in-linux-bash-not-home-directory/ 의 복제본입니다 . 이 질문을 중복으로 끝내는 것으로 유명하지 않습니다.
나는 ~
홈 디렉토리에서와 같이 말하는 것이 아니라 오히려 이것을 참조한다.
$ ls ~foo/bar
/some/mount/point/foo/bar
그러나 다른 마운트 포인트로 시도하면 다음과 같습니다.
$ mount | ag "/dev "
devfs on /dev (devfs, local, nobrowse)
$ ls /dev/stdin
/dev/stdin
$ ls ~stdin
zsh: no such user or named directory: stdin .
# bash has a similar error message:
ls: ~stdin: No such file or directory
~
이 맥락에서 무엇이 부름입니까? 어떻게 작동합니까?
편집 : 아래의 의견 중 일부에 대한 자세한 내용 :
foo
내 시스템의 사용자 이름이 아님을 증명할 수 있습니다 .- 자동 완성을 시도 할 때
ls -lah ~
모든 옵션이 표시되지는 않습니다. 즉 , 자동 완성에 표시되지 않는cd ~qux
경우 할 수qux
있습니다. 다시 한 번qux
내 시스템의 사용자가 아닙니다. - 중요한
/some/mount/point
것은 네트워크 공유입니다. - 모든 세부 사항은 경로 이름 확장의 Z 쉘 기능인 일부 이름이 지정된 경로 muckery를 제안하지만 이것은 Z 쉘의 이름 지정된 경로와 같은 것을 지원하지 않는 bash에서도 작동합니다.
답변
~ foo는 무엇입니까
bash 매뉴얼 에서 인용 (추가 강조) :
단어가 인용 부호없는 물결표 문자 (`~ ‘)로 시작하면, 인용되지 않은 첫 번째 슬래시 (또는 인용 부호가없는 슬래시가없는 모든 문자) 앞에 오는 모든 문자는 물결표 접두어로 간주됩니다. 물결표 접두어가 인용되면 물결표 뒤에 물결표 접두어 문자가 가능한 로그인 이름 으로 처리됩니다 .
~foo
에 foo
지정된대로 정확하게 사용자의 홈 디렉토리로 확장됩니다 /etc/passwd
. 여기에는 시스템 사용자 이름이 포함될 수 있습니다. 반드시 인간 사용자를 의미하거나 실제로 로컬로 로그인 할 수있는 것은 아닙니다 (예 : SSH 키를 통해 로그인 할 수 있음).
에서 언급 한 바와 같이 사실, 의견 , bash
사용 getpwnam
기능. 이 기능 자체는 POSIX 표준에 의해 지정 되므로 macOS X를 포함한 대부분의 유닉스 계열 시스템에 존재해야합니다 . 이 기능은 /etc/passwd
LDAP 및 NIS와 같은 다른 데이터베이스에만 국한되지 않고 검색합니다. 394 행에서 시작하는 bash
소스 코드 , tilde.c
파일 에서 발췌 한 내용 :
/* No preexpansion hook, or the preexpansion hook failed. Look in the
password database. */
dirname = (char *)NULL;
#if defined (HAVE_GETPWNAM)
user_entry = getpwnam (username);
#else
user_entry = 0;
실제 예
아래는 내 시스템에서 시스템 사용자 이름으로 테스트 한 것을 볼 수 있습니다. 해당 passwd
항목 및 결과에주의ls ~username
$ grep '_apt' /etc/passwd
_apt:x:104:65534::/nonexistent:/bin/false
$ ls ~_apt
ls: cannot access '/nonexistent': No such file or directory
$ grep '^lp' /etc/passwd
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
$ ls ~lp
ls: cannot access '/var/spool/lpd': No such file or directory
예를 들어 _apt
계정이 출력에 의해 제안 된대로 잠겨 있더라도 passwd -S apt
가능한 로그인 이름으로 여전히 표시됩니다.
_apt L 11/29/2017 0 99999 7 -1
참고 : 이것은 macOS 전용 기능이 아니라 셸 전용 기능입니다.
답변
에 대한 정보가 표시되는 이유를 요약하면 홈 디렉토리에 폴더가있는 시스템에 ~foo/bar
이름이 지정된 사용자가 있기 때문 입니다.foo
bar
왜 (물결표) 가 단순한 “홈 디렉토리”이상 인지 설명하는 다른 커뮤니티에서이 솔루션을 참조하십시오 ~
.
bin
시스템에 사용자 이름이 지정된 경우 다음 명령 으로 bin 홈 디렉토리의 내용을 나열 할 수 있습니다 .
ls ~bin
시도 할 수있는 또 다른 방법은 프롬프트에서 다음을 입력 한 후 탭 완성을 사용하는 것입니다 (캐리지 리턴하지 말고 탭 키를 사용하십시오).
ls -lah ~
tab
~
계속하면 확장 될 사용자의 홈 디렉토리 목록을 볼 수 있습니다. 탭 완성의 예 (잘린) 출력ls -lah ~
tab
$ ls -lah ~ [tab]
~antman/ ~games/
~bin/ ~mail/