編集:これは重複です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シリーズシステムに存在する必要があります。Mac 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
もう一度試すことができるもう1つの方法は、プロンプトで次のように入力してタブを完成させることです(Enterキーを押すのではなく、タブキーのみを使用してください)。
ls -lah ~
tab
~
続行すると、拡張ユーザーのホームディレクトリのリストが表示されます。タップ補完の(切り捨て)出力例ls -lah ~
tab
$ ls -lah ~ [tab]
~antman/ ~games/
~bin/ ~mail/