編集:これは 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 ~
をオートコンプリートしようとすると、一部のオプションが表示されません。つまり、オートコンプリートにqux
が表示されない場合でも、cd ~qux
を実行できます。ここでもqux
は私のシステムのユーザーではありません。/some/mount/point
はネットワーク共有です。bashマニュアル からの引用(強調を追加):
Wordが引用符で囲まれていないチルダ文字( `〜 ')で始まる場合、最初の引用符で囲まれていないスラッシュの前のすべての文字(または引用符で囲まれていないスラッシュがない場合はすべての文字)は、チルダプレフィックスと見なされます。チルダプレフィックスは引用符で囲まれ、チルダに続くチルダプレフィックスの文字は可能ログイン名として扱われます。
~foo
は、/etc/passwd
で指定されたとおりにfoo
ユーザーのホームディレクトリに展開されます。これにはシステムのユーザー名を含めることができることに注意してください。これは必ずしも人間のユーザーを意味するわけではなく、実際にローカルでログインできることも意味しません(たとえば、SSHキーを使用してログインできます)。
実際、 コメント で述べたように、bash
はgetpwnam
関数を使用します。その関数自体は [〜#〜] posix [〜#〜] 標準で指定されているため、 macOS X を含むほとんどのUnixライクなシステムに存在するはずです。この関数は/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固有の機能ではなく、シェル固有の機能です。
~foo/bar
の何かが表示される理由を要約すると、ホームディレクトリにfoo
という名前のフォルダーを持つシステムでbar
という名前のユーザーがいるためです。
(チルダ)~
が単なる「ホームディレクトリ」ではない理由を説明する別のコミュニティ(---)で、 このソリューションを参照してください 。
システムにbin
という名前のユーザーがいる場合、次のコマンドでbinのホームディレクトリの内容を一覧表示できます。
ls ~bin
もう1つ試すことができるのは、プロンプトで次のように入力した後でタブ補完を使用することです(キャリッジリターンではなく、タブキーを使用するだけです)。
ls -lah ~
tab
続行すると、~
が展開するユーザーのホームディレクトリのリストを確認できます。 ls -lah ~
のタブ補完の出力例(切り捨て) tab
$ ls -lah ~ [tab]
~antman/ ~games/
~bin/ ~mail/