편집 : 이것은 중복입니다https://stackoverflow.com/questions/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 쉘의 경로 이름 확장 기능인 이름 지정 경로 혼란이 있음을 나타냅니다. 그러나 이는 bash에도 적용되지만 bash는 분명히 Z 쉘의 이름 지정된 경로와 같은 기능을 지원하지 않습니다.
답변1
~foo가 뭐야?
에서 인용배쉬 매뉴얼(추가 강조):
단어가 따옴표 없는 물결표(`~')로 시작하면 따옴표 없는 첫 번째 슬래시 앞의 모든 문자(또는 따옴표 없는 슬래시가 없는 경우 모든 문자)는 물결표 접두사로 처리됩니다. 물결표 접두어는 따옴표로 묶고, 물결표 접두어에서 물결표 뒤의 문자는 다음과 같이 처리됩니다.가능한로그인 이름.
~foo
foo
에 지정된 대로 정확하게 사용자의 홈 디렉토리로 확장됩니다 /etc/passwd
. 여기에는 시스템 사용자 이름이 포함될 수 있습니다. 반드시 인간 사용자이거나 실제로 로컬로 로그인할 수 있다는 의미는 아닙니다(예: SSH 키를 통해 로그인할 수 있음).
사실 본문에도 나와있듯이논평, 기능이 bash
사용됩니다 getpwnam
. 기능 자체는 다음과 같이 구성됩니다.POSIX표준이므로 다음을 포함하여 대부분의 Unix 계열 시스템에 존재해야 합니다.맥 OS. 이 기능은 /etc/passwd
LDAP 및 NIS와 같은 다른 데이터베이스 검색 에만 국한되지 않습니다 . 특별 발췌bash
소스 코드, tilde.c
파일, 394행에서 시작:
/* 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 특정 기능이 아니라 셸 특정 기능입니다.
답변2
요약하자면, 여러분이 보고 있는 이유 는 시스템에 이름이 지정된 사용자가 있고 해당 사용자의 홈 디렉터리에 이름이 지정된 폴더가 있기 ~foo/bar
때문입니다 .foo
bar
바라보다다른 커뮤니티의 이 솔루션이것은 (물결표)가 ~
단순한 "홈 디렉토리"가 아닌 이유를 설명합니다.
시스템에 명명된 사용자가 있는 경우 bin
다음을 나열할 수 있습니다.bin의 홈 디렉토리명령을 통해:
ls ~bin
시도해 볼 수 있는 또 다른 방법은 프롬프트에 다음을 입력한 후 탭 완성을 사용하는 것입니다(Enter 키를 누르지 말고 탭 키만 사용하세요).
ls -lah ~
tab
~
계속하면 확장되는 사용자 홈 디렉터리 목록을 봅니다 . 탭 완성의 (잘린) 출력 예ls -lah ~
tab
$ ls -lah ~ [tab]
~antman/ ~games/
~bin/ ~mail/