$HOME
および~
は通常、同じものを指します。つまり、「/ home/userName」という一般的な形式の「ユーザーのホーム」ディレクトリへのパスです。
これらが同じディレクトリを参照していない場合はいつですか?
$HOME
と~
はどちらも、現在のユーザーのホームフォルダーである同じフォルダーを指しますが、どちらも大きく異なります。
$HOME
は環境変数であり、現在のユーザーのホームフォルダーを含むように設定されています。~
はシェル拡張シンボルです。つまり、実際のコマンドが実行される前に処理されるシンボルの1つです。 ~
だけで$ HOMEの値に展開されます。 ~nemo
は、ユーザーnemo
のホームディレクトリに展開されます。シェル拡張シンボルは、実際のコマンドを構築するためにシェルによって処理/解釈される文字(または文字のペア)です。シェル拡張シンボルのもう1つの例は、*
で、ファイル名を拡張するために使用されます。それらが異なる1つの方法は、"
の種類の引用符で囲まれたときにBashシェルがそれらを変換する方法にあります。
引用符なしでecho
をこのように使用すると、~
と$HOME
は同じ効果になります。
$ echo ~
/home/elias
$ echo $HOME
/home/elias
ただし、それらを"
引用符で囲むと、結果が異なります。
$ echo "~"
~
$ echo "$HOME"
/home/elias
~
は、 tilde-prefix の一部としてのみ展開されます。これは、定義により、語。さらに、以前はグロビングパターンの一部だったため、~
は二重引用符内では機能しません。したがって、"~"
またはa~b
を使用すると、~
のリテラル値が保持されます。
単一の~
(または~
の後に/
が続く)は、現在のユーザーの家に展開されます。
$ echo ~/.ssh
/home/user/.ssh
~
の後にユーザー名が続くと、そのユーザーのホームフォルダに展開されます。
$ echo ~root/.ssh
/root/.ssh
~
の後に+
または-
が続き、オプションの数値は ディレクトリスタック の要素に展開されます。
$ cd /etc
$ echo ~+0
/etc
$HOME
は、単一の~
と同等であり、代わりに変数の構文規則に従います。たとえば、二重引用符内で展開され、設定を解除でき、 文字列操作オペランド を適用できます。
これは、拡張が何を行うかに大きく依存します。 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では、~
と$HOME
を differentfunctions で展開する必要があります。他のいくつかの場所では変数を使用でき、ワイルドカードやチルダ展開などの他のシェル構文は使用できません(例:~/.pam_environment
、変数の展開に特別な構文があります)。さらに他の場所では、チルダ展開を例外として許可しますが(例: systemd )、$HOME
を使用する代わりに直接passwdデータベースをクエリします。
チルダ拡張はBSD csh tcsh GNU bashなどで見つかる拡張であるため、$ HOME /は標準のPOSIX.2 Bourne/bin/shで動作する可能性が高くなります。
Busybox、dash、またはBSD shに移植可能なスクリプトを記述したい場合は、〜/でクラッシュしないように、余分な文字に投資してください。特定のシステムでは、そのようなファイルやディレクトリはありません。
$ HOME /も読みやすくなっています。