web-dev-qa-db-ja.com

$ HOMEと〜の違い

$HOMEおよび~は通常、同じものを指します。つまり、「/ home/userName」という一般的な形式の「ユーザーのホーム」ディレクトリへのパスです。

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

31
H2ONaCl

$HOME~はどちらも、現在のユーザーのホームフォルダーである同じフォルダーを指しますが、どちらも大きく異なります。

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

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

引用符なしでechoをこのように使用すると、~$HOMEは同じ効果になります。

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

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

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

~は、 tilde-prefix の一部としてのみ展開されます。これは、定義により、語。さらに、以前はグロビングパターンの一部だったため、~は二重引用符内では機能しません。したがって、"~"またはa~bを使用すると、~のリテラル値が保持されます。

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

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

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

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

~の後に+または-が続き、オプションの数値は ディレクトリスタック の要素に展開されます。

$ cd /etc
$ echo ~+0
/etc

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

13

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

$ 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では、~$HOMEdifferentfunctions で展開する必要があります。他のいくつかの場所では変数を使用でき、ワイルドカードやチルダ展開などの他のシェル構文は使用できません(例:~/.pam_environment、変数の展開に特別な構文があります)。さらに他の場所では、チルダ展開を例外として許可しますが(例: systemd )、$HOMEを使用する代わりに直接passwdデータベースをクエリします。

3
homeboy

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

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

$ HOME /も読みやすくなっています。

1
Roman Czyborra