web-dev-qa-db-ja.com

パスの接頭辞として使用される〜(チルド)とは何ですか?

編集:これは 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 ~をオートコンプリートしようとすると、一部のオプションが表示されません。つまり、オートコンプリートにquxが表示されない場合でも、cd ~quxを実行できます。ここでもquxは私のシステムのユーザーではありません。
  3. 問題がある場合、/some/mount/pointはネットワーク共有です。
  4. 詳細はすべて、パス名展開のZシェル機能である名前付きパスの悪意を示唆していますが、これはbashでも機能し、明らかにZシェルの名前付きパスなどをサポートしていません。
11
R.D.

〜fooとは

bashマニュアル からの引用(強調を追加):

Wordが引用符で囲まれていないチルダ文字( `〜 ')で始まる場合、最初の引用符で囲まれていないスラッシュの前のすべての文字(または引用符で囲まれていないスラッシュがない場合はすべての文字)は、チルダプレフィックスと見なされます。チルダプレフィックスは引用符で囲まれ、チルダに続くチルダプレフィックスの文字は可能ログイン名として扱われます。

~fooは、/etc/passwdで指定されたとおりにfooユーザーのホームディレクトリに展開されます。これにはシステムのユーザー名を含めることができることに注意してください。これは必ずしも人間のユーザーを意味するわけではなく、実際にローカルでログインできることも意味しません(たとえば、SSHキーを使用してログインできます)。

実際、 コメント で述べたように、bashgetpwnam関数を使用します。その関数自体は [〜#〜] 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固有の機能ではなく、シェル固有の機能です。

14

~foo/barの何かが表示される理由を要約すると、ホームディレクトリにfooという名前のフォルダーを持つシステムでbarという名前のユーザーがいるためです。

(チルダ)~が単なる「ホームディレクトリ」ではない理由を説明する別のコミュニティ(---)で、 このソリューションを参照してください

システムにbinという名前のユーザーがいる場合、次のコマンドでbinのホームディレクトリの内容を一覧表示できます。

ls ~bin

もう1つ試すことができるのは、プロンプトで次のように入力した後でタブ補完を使用することです(キャリッジリターンではなく、タブキーを使用するだけです)。

ls -lah ~ tab

続行すると、~が展開するユーザーのホームディレクトリのリストを確認できます。 ls -lah ~のタブ補完の出力例(切り捨て) tab

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