$ HOMEと〜の違い


31

$HOMEそして~通常は同じものを参照してください。つまり、一般的な形式の「/ home / userName」である「user's home」ディレクトリへのパスです。

ある場合、これらが同じディレクトリを参照しないのはいつですか?


11
~$ HOMEがいない間に依存シェルです。
Kulfy

回答:


45

両方とも、現在のユーザーのホームフォルダーである同じフォルダー$HOME~指しますが、どちらも非常に異なるものです。

  • $HOME現在のユーザーのホームフォルダーを含むように設定されている環境変数です
  • ~は、シェル拡張シンボルです。つまり、実際のコマンドが実行される前に処理されるシンボルの1つです。~単独で$ HOMEの値に展開されます。~nemouserのホームディレクトリに展開しますnemo。シェル展開記号は、実際のコマンドを作成するためにシェルによって処理/解釈される文字(または文字のペア)です。シェル展開シンボルの別の例は、*ファイル名を展開するために使用されます。

1
~$ HOME、またはWindowsでは%APPDATA%に展開されます。定義されていない場合は、「パスワードデータベース」でパスを検索します(通常はを意味し/etc/passwdますが、LDAPまたは他のデータソースである可能性があります)。約20年前には、一部のマシンでは$ HOMEが設定されていないかもしれないが~、何かに拡張されることが保証されていると警告されていたかもしれません。
MirekDługosz

この違いは、あなたが必要とする2のかを知る必要があるときに、メイクのようなプログラムで注目すべきである
D.ベンKnoble

3
@MirekDługosz少なくともWindowsのgit bashでは、ではなく(に等しい)に~展開されます。そして、cmd.exeでは、展開しません。$HOME$HOMEPATH$APPDATA~
ハイド

1
@vanadiumはHOME(でOSの概念、環境変数であるSHの例とのセットのためのシェルexportまたはdeclare -x()ではなく、シェル変数は、シェルに完全に依存しますが、中に定義うちのshシェル、それは通常で設定されているfoo=valueかとsetか、いくつかの他に方法)。
ハイド

1
@hyde間違ったことを言いました。bashは$ HOMEをチェックします。設定されていない場合は%APPDATA%をチェックしますが、Windowsのみです。設定されていない場合は、「パスワードデータベース」を検索します。参照してくださいgit.savannah.gnu.org/cgit/bash.git/tree/lib/readline/...
MirekDługosz

17

それらが異なる1つの方法は、"一種の引用符で囲まれたときにBashシェルがそれらを変換する方法です。

echoこのように引用符なしで使用する~$HOME、同じ効果があります:

$ echo ~
/home/elias
$ echo $HOME
/home/elias

ただし、"引用符で囲むと、結果が異なります。

$ echo "~"
~
$ echo "$HOME"
/home/elias

13

~定義上、単語の先頭から開始する必要があるチルダプレフィックスの一部としてのみ展開されます。また、以前はグロビングパターンの一部であったため、~二重引用符内では機能しません。そのため、"~"またはa~bそのままのリテラル値に~なります。

単一~(またはに~続く/)は、現在のユーザーの自宅に展開されます。

$ echo ~/.ssh
/home/user/.ssh

~後にユーザー名が続くと、そのユーザーのホームフォルダーに展開されます。

$ echo ~root/.ssh
/root/.ssh

Aは、~続いて+又は-および任意の数の要素を拡大するディレクトリスタック

$ cd /etc
$ echo ~+0
/etc

$HOMEは、~代わりに変数の構文規則に従うsingle と同等です。たとえば、二重引用符内で展開し、設定解除でき、文字列操作オペランドを適用できます。


3

これは、拡張の内容に大きく依存します。bashでは~、引用符で囲まれていなくても、ファイル名の展開や単語の分割をトリガーせずにホームディレクトリを取得する便利な方法です。例えば:

$ HOME='/*'
$ echo $HOME
/bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
$ echo ~
/*

または:

$ HOME='/ a b'
$ printf "|%s|\n" $HOME ~
|/|
|a|
|b|
|/ a b|

したがって、何らかの理由で引用符と格闘している場合(この場合、本当に全体を再考する必要があり、豚を格闘する方が簡単です)、~より便利かもしれません。


それ以外の国では、Pythonで、例えば、~および$HOMEによって拡張する必要が異なる 機能。他の場所では、変数を許可し、ワイルドカードやチルダ展開などの他のシェル構文を許可しません(たとえば、~/.pam_environment変数展開のための特別な構文があります)。さらに他の場所では、チルダの展開を例外として許可しています(例:systemd)が、を使用する代わりにpasswdデータベースを直接照会します$HOME


ここで示すが、言及していない別の大きな違いは、の値を変更できるが、の値を$HOME(直接)変更できないことです~
ジョー

だから、同じものを参照するか$HOME~ないかを尋ねました-通常はデフォルトで行う-そして、あなたは意図的に同じものを参照しないように環境変数に割り当てます。これは良いデモンストレーションですが、不必要に紛らわしいです。
H2ONaCl

1

チルダ展開はBSD csh tcsh GNU bashなどで見られる拡張機能であるため、$ HOME /は標準POSIX.2 Bourne / bin / shで動作する可能性が高くなります。

busybox、dash、またはBSD shに移植可能なスクリプトを作成する場合は、〜/:でクラッシュしないように追加の文字に投資してください。特定のシステムにはそのようなファイルやディレクトリはありません。

また、$ HOME /の方が読みやすいと思います。


スクリプトでは、読みやすさと可視性が重要です。おそらく、これが私のスクリプトが使用し$HOME、ほとんど使用しない理由~です。私の前の自己はおそらくこれを知っていました。
H2ONaCl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.