경로의 접두사로 사용될 때 ~ (물결표)는 무엇입니까? 것이 아니라 오히려

편집 : 이것은 /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

~이 맥락에서 무엇이 부름입니까? 어떻게 작동합니까?

편집 : 아래의 의견 중 일부에 대한 자세한 내용 :

  1. foo내 시스템의 사용자 이름이 아님을 증명할 수 있습니다 .
  2. 자동 완성을 시도 할 때 ls -lah ~모든 옵션이 표시되지는 않습니다. 즉 , 자동 완성에 표시되지 않는 cd ~qux경우 할 수 qux있습니다. 다시 한 번 qux내 시스템의 사용자가 아닙니다.
  3. 중요한 /some/mount/point것은 네트워크 공유입니다.
  4. 모든 세부 사항은 경로 이름 확장의 Z 쉘 기능인 일부 이름이 지정된 경로 muckery를 제안하지만 이것은 Z 쉘의 이름 지정된 경로와 같은 것을 지원하지 않는 bash에서도 작동합니다.


답변

~ foo는 무엇입니까

bash 매뉴얼 에서 인용 (추가 강조) :

단어가 인용 부호없는 물결표 문자 (`~ ‘)로 시작하면, 인용되지 않은 첫 번째 슬래시 (또는 인용 부호가없는 슬래시가없는 모든 문자) 앞에 오는 모든 문자는 물결표 접두어로 간주됩니다. 물결표 접두어가 인용되면 물결표 뒤에 물결표 접두어 문자가 가능한 로그인 이름 으로 처리됩니다 .

~foofoo지정된대로 정확하게 사용자의 홈 디렉토리로 확장됩니다 /etc/passwd. 여기에는 시스템 사용자 이름이 포함될 수 있습니다. 반드시 인간 사용자를 의미하거나 실제로 로컬로 로그인 할 수있는 것은 아닙니다 (예 : SSH 키를 통해 로그인 할 수 있음).

에서 언급 한 바와 같이 사실, 의견 , bash사용 getpwnam기능. 이 기능 자체는 POSIX 표준에 의해 지정 되므로 macOS X를 포함한 대부분의 유닉스 계열 시스템에 존재해야합니다 . 이 기능은 /etc/passwdLDAP 및 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이름이 지정된 사용자가 있기 때문 입니다.foobar

왜 (물결표) 가 단순한 “홈 디렉토리”이상 인지 설명하는 다른 커뮤니티에서이 솔루션을 참조하십시오 ~.

bin시스템에 사용자 이름이 지정된 경우 다음 명령 으로 bin 홈 디렉토리의 내용을 나열 할 수 있습니다 .

ls ~bin

시도 할 수있는 또 다른 방법은 프롬프트에서 다음을 입력 한 후 탭 완성을 사용하는 것입니다 (캐리지 리턴하지 말고 탭 키를 사용하십시오).

ls -lah ~ tab

~계속하면 확장 될 사용자의 홈 디렉토리 목록을 볼 수 있습니다. 탭 완성의 예 (잘린) 출력ls -lah ~ tab

$ ls -lah ~ [tab]
~antman/            ~games/
~bin/               ~mail/