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


11

編集:これは/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シェル機能である名前付きパスマッカーリーを示唆していますが、これはbashでも機能します。

5
~fooは、ユーザーのホームディレクトリですfoo。ユーザーが指定されていない場合、現在のユーザーがデフォルトになります。
-DopeGhoti

しかし、この場合、/some/mount/point間違いなく私のホームディレクトリではありません。 cd ~私を取る/Users/$username/--whichマッチ$HOME
RD

1
zshチルダを使用して名前付きディレクトリを示すようにも見えます。
DopeGhoti

私もそれを疑った!何らかの理由を除いて、上記で投稿した一連のコマンドはbashでも機能します(bash -c "ls ~foo/bar")-名前付きディレクトリがありません。さらに、zsh内でも、を調べてもenv、名前付きディレクトリが設定されていないことがわかります。私は、Mac OS上だと私は、これはOS Xにいくつかの機能の特定と感じる
RD

1
あなただけが言った~foo。実際の文字列(例ではなくfoo)を取得して、実行しますgrep "actual username" /etc/passwd。bashマニュアルによると、可能なログインユーザー名~textだけで機能するはずです(たとえば、実際にログインできることを意味するわけではありません。たとえば、などのシステムユーザーの場合)。私のすべてのテストでは、はユーザー名であることに対応しています。~lp~stringstring
セルギーKolodyazhnyy

回答:


14

〜fooとは

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

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

~foofoo指定されたとおりにユーザーのホームディレクトリに展開され/etc/passwdます。これにはシステムのユーザー名を含めることができることに注意してください。これは、必ずしも人間のユーザーを意味するわけではなく、実際にローカルでログインできることも意味しません(たとえば、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固有の機能ではなく、シェル固有の機能です。


シェルが、アカウントの有効期限やチルダを拡張するときにロックされているかどうかなど、何かを見つけることに依存できるとは思えません。たとえば、Linuxでは、有効期限は/etc/shadowパスワードなどの他の保護された認証情報とともにに保存されます。の参照passwdは、パスワードを無効にすることだけです。他の手段による認証を妨げることはありません。
ilkkachu 2018

@ilkkachuうん、そうだね。私はtestuser、パスワードの有効期限を追加および変更してテストしました。ユーザー名は引き続きタブ補完に表示されます。私は答えからそのビットを取り除きました
セルギー・コロディアズニー

1
この回答の唯一の問題は、bashmanページを引用していることです(そして、古いページのようです)。OPは実際に使用しzshています(より明確であった可能性があります)。ただし、コメントではbash同じ動作をしていると述べています。
ケンウェインヴァンダーリンデ2018

2
getent passwd foo代わりにgrep foo /etc/passwordを使用して、シェルと同じルックアップメカニズムに従うことができます。@ Abigailが言及しているネットワークベースのディレクトリサービスが含まれている可能性があります。
RJHunter 2018

1
「LDAPやNISなど」ビットの回答として受け入れられましたが、私の場合は正しい結果になりました。
RD

5

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

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

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

ls ~bin

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

ls -lah ~ tab

~続行すると展開されるユーザーのホームディレクトリのリストを表示します。次のタブ補完の出力例(切り捨て)ls -lah ~ tab

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

1
タブ補完の場合は+1。これにより、bashがから可能な限りのログイン名を取得できるすべてのユーザー名が明らかになります/etc/passwd。もちろん、ユーザーがシステム上にあるユーザー名を知っている場合は、何が起こっているのかをすぐに明らかにするのに役立ちます。
Sergiy Kolodyazhnyy

2
bash補完のヒントをありがとう-いくつかの興味深いオートコンプリート結果が得られました。一方では、~fooオートコンプリートをした、私はそれが証明することができfoo、私のシステム上のユーザー(実際には存在しないではありません/etc/passwd)。さらに、すべてのフォルダ/ファイルが/some/mount/pointオートコンプリートに表示されるので非常に興味深いです。
RD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.