Linux bashのチルダの意味(ホームディレクトリではない)


106

まず、私はそれ~/がホームディレクトリであることを知っています。CDに移動する~~/、ホームディレクトリに移動します。

しかし、何かcd ~X特別な場所に連れて行ってくれXます。

bashで「cd ~」を押してタブを押すと、およびの~Xような可能なオプションがたくさん表示されます。これらのフォルダーに移動してa を実行すると、これらのフォルダーがホームディレクトリにないことがわかります。彼らは至る所にいます。~mail~postgres~sshpwd

それらはエイリアスではありません。確認しました。これらはenv.変数ではないか、そうでなければ$

これらのリンクの設定とは何ですか。また、これらのリンクが設定されている場所はどこにありますか?


〜Xは単にリテラル「〜X」を返しますが、〜は$ HOMEを返し、〜+は$ PWDを返します。これらはシェル変数をフェッチすること以外は特別ではありません。つまり、値を保存したり、コマンドを実行してそれらを検索したりしません。それらはすでに定義されています。〜-試しましたか?使い方は思いつきませんが、シェル変数$ OLDPWDを返します
SDsolar 2017

回答:


71

これは「チルダ拡張」と呼ばれるBash機能です」。OSではなく、シェルの機能です。たとえば、cshを使用すると異なる動作が得られます。

情報がどこから来ているかという質問に答えるには、ホームディレクトリは変数$HOME(どこに保存されているかに関係なく)から取得され、他のユーザーのホームはを使用してリアルタイムで取得されますgetpwent()。この機能は通常、NSSによって制御されます。したがって、デフォルトではから値が引き出されますが/etc/passwd、NIS、LDAP、SQLデータベースなどの任意のソースを使用して情報を取得するように設定できます。

ティルダ展開は、ホームディレクトリの検索以上のものです。ここに要約があります:

~              $HOME
~fred          (freds home dir)

~+             $PWD       (your current working directory)
~-             $OLDPWD    (your previous directory)
~1             `dirs +1`
~2             `dirs +2`
~-1            `dirs -1`

dirsそして~1~-1などと組み合わせて使用されているpushdpopd


注意として、はプレーンチルド(〜)を除いてそれらのいずれもサポートしていません

なぜ彼らは思いついたの~+ですか?かなり役に立たないようです。
cregox

3
〜+はとほぼ同じです。ただし、。/ fileのようなものを使用するには、ファイルシステムに移動して、どこにあるかを把握する必要があります。あります-数サイクルかかります。〜+を使用すると、ファイルシステムをトラバースするときにすでに定義されているシェル変数$ PWDの内容を返すだけで、作業を節約できます。
SDsolar 2017

32

これらはユーザーのホームディレクトリです。cd ~(your username)たとえばを試してください。


1
彼らは、サービスアカウントは、下の/ homeホームディレクトリを持っていない、シンボリックリンクじゃない
アナベッツ

私の場合はベストアンサー。また、私の特定のケースでは、ホームフォルダーではなく、ルートディレクトリ/フォルダーでした。
wlwl2 2017

16

それらはのユーザーのホームディレクトリ/etc/passwdですか?postgres、sendmail、apacheなどのサービスは、通常のユーザーと同じようにホームディレクトリを持つシステムユーザーを作成します。


2
実際、彼らは〜usernameは、指定したユーザのホームディレクトリがある
スティーブWeet

14

それらはユーザーです。を確認してください/etc/passwd

cd ~username そのユーザーのホームディレクトリに移動します。


FTW。賛成票。TNXがそれを解消しました。そのサイクルにはいくつのサイクル、そしておそらくサブシェルさえ含まれているのでしょうか。小さなISPのように、システムに3Kユーザーがいると想像してみてください。うわぁ。
SDsolar 2017

9

私のマシンでは、物事をセットアップする方法が原因で、次のようにしています:

cd ~             # /work1/jleffler
cd ~jleffler     # /u/jleffler

最初は環境変数の値に注意を払います$HOME$HOMENFSマウントされたファイルシステムではなく、ローカルファイルシステムを意図的に設定しました。2番目は、パスワードファイルから読み取り(おおよそ、NISは少し複雑です)、パスワードファイルでホームディレクトリが/u/jlefflerあり、そのディレクトリに移動したこと。

ほとんどのソフトウェアは上記のように動作します(そして、シェルのPOSIX仕様ではこの動作が必要です)。パスワードファイルの情報を$ HOMEの現在の値として処理するいくつかのソフトウェアを使用しています(使用する選択肢はあまりありません)。これは誤りです。

これを質問に適用する-他の人が指摘したように、「cd ~x」はユーザー「x」のホームディレクトリに移動し、より一般的には、チルダ展開が行われるたびに~x、ユーザー「x」のホームディレクトリを意味します(エラーですユーザー「x」が存在しない場合)。


それは言及する価値があるかもしれません:

cd ~-       # Change to previous directory ($OLDPWD)
cd ~+       # Change to current directory ($PWD)

~+現在のディレクトリへのパスでシンボリックリンクを移動するという奇妙なことをしない限り、すぐに ' 'の使用法を見つけることはできません。

次のこともできます:

cd -

つまりと同じ~-です。


1
についてcd ~+:それはあなたが現在使用しているディレクトリがまだ存在するかどうかを確認するためにそれを使用する可能性があります-それがそうすることのかなり非標準的な方法であっても。
professorsloth


1

あなたが使用しているautofs場合、拡張は実際に/etc/auto.home(またはあなたのディストリビューションと同様に)行われている可能性があります。たとえば、私の/etc/auto.masterようになります:

/home2 auto.home --timeout 60

そして/etc/auto.home次のようになります:

mgalgs -rw,noquota,intr space:/space/mgalgs

0

OpenDirectory / ActiveDirectory / LDAPユーザーがホームディレクトリに「自動マウント」されていることを確認できます。

* nixでは~、ホームディレクトリに解決されます。同様~Xに「ユーザーX」に解決されます。

ディレクトリの自動マウントと同様に、OpenDirectory / ActiveDirectory / LDAPは、大規模な企業環境でユーザーディレクトリを自動マウントするために使用されます。これらのユーザーは実際の人である場合もあれば、さまざまな機能を提供するために作成されたマシンアカウントである場合もあります。

入力した場合 ~Tabすると、マシン上のユーザーのリストが表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.