경로 접두사로 사용되는 ~(물결표)는 무엇입니까?

경로 접두사로 사용되는 ~(물결표)는 무엇입니까?

편집 : 이것은 중복입니다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

~이 경우에는 뭐라고 부르나요? 어떻게 작동하나요?

편집: 아래의 일부 의견을 기반으로 한 추가 정보:

  1. foo이것이 내 시스템의 사용자 이름이 아니라는 것을 증명할 수 있습니다 .
  2. 자동 완성을 시도할 때 ls -lah ~모든 옵션이 표시되는 것은 아닙니다. 즉, 자동 완성에 표시되지 않을 cd ~qux때 할 수 있습니다 . qux다시 한 번 qux내 시스템의 사용자가 아닙니다.
  3. 중요한 것은 /some/mount/point네트워크 공유뿐입니다.
  4. 모든 세부 사항은 Z 쉘의 경로 이름 확장 기능인 이름 지정 경로 혼란이 있음을 나타냅니다. 그러나 이는 bash에도 적용되지만 bash는 분명히 Z 쉘의 이름 지정된 경로와 같은 기능을 지원하지 않습니다.

답변1

~foo가 뭐야?

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

단어가 따옴표 없는 물결표(`~')로 시작하면 따옴표 없는 첫 번째 슬래시 앞의 모든 문자(또는 따옴표 없는 슬래시가 없는 경우 모든 문자)는 물결표 접두사로 처리됩니다. 물결표 접두어는 따옴표로 묶고, 물결표 접두어에서 물결표 뒤의 문자는 다음과 같이 처리됩니다.가능한로그인 이름.

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

사실 본문에도 나와있듯이논평, 기능이 bash사용됩니다 getpwnam. 기능 자체는 다음과 같이 구성됩니다.POSIX표준이므로 다음을 포함하여 대부분의 Unix 계열 시스템에 존재해야 합니다.맥 OS. 이 기능은 /etc/passwdLDAP 및 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때문입니다 .foobar

바라보다다른 커뮤니티의 이 솔루션이것은 (물결표)가 ~단순한 "홈 디렉토리"가 아닌 이유를 설명합니다.

시스템에 명명된 사용자가 있는 경우 bin다음을 나열할 수 있습니다.bin의 홈 디렉토리명령을 통해:

ls ~bin

시도해 볼 수 있는 또 다른 방법은 프롬프트에 다음을 입력한 후 탭 완성을 사용하는 것입니다(Enter 키를 누르지 말고 탭 키만 사용하세요).

ls -lah ~ tab

~계속하면 확장되는 사용자 홈 디렉터리 목록을 봅니다 . 탭 완성의 (잘린) 출력 예ls -lah ~ tab

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

관련 정보