~によるとこの回答私自身の理解によると、チルダはホームディレクトリに展開されます。
$ echo ~
/home/braiam
シェル拡張が機能したいときはいつでも(たとえば、変数名を使用し、$FOO
予期しない文字、スペースなどによって中断されない)、二重引用符を使用する必要があります"
。
$ FOO="some string with spaces"
$ BAR="echo $FOO"
$ echo $BAR
echo some string with spaces
この拡張機能がチルダで機能しないのはなぜですか?
$ echo ~/some/path
/home/braiam/some/path
$ echo "~/some/path"
~/some/path
答え1
その理由は、二重引用符内のチルダは~
特別な意味がないため、リテラルとして扱われるからです。
POSIXの定義二重引用符ように:
二重引用符( "")で囲まれた文字は、ドル記号、バックティック、およびバックスラッシュ文字を除いて、二重引用符内のすべての文字のリテラル値を保持します。
...
アプリケーションでは、二重引用符の前にバックスラッシュがあり、その中に二重引用符があることを確認する必要があります。パラメータ「@」は二重引用符の中で特別な意味を持ちます。
$と以外の文字は二重引用符内のリテラルとして扱われ`ます。\@
答え2
チルダ拡張POSIX は次のように定義されます。
「チルダプレフィックス」は次のように指定されます。引用しない単語の先頭の<波紋>文字、単語に引用符がない最初の<スラッシュ>の前の文字、または<スラッシュ>がない場合の単語のすべての文字。割り当てでは、複数のチルダプレフィックスを使用できます。割り当ての<等号>の後に[...]、引用符がない<コロン>、またはその両方。 [...]チルダプレフィックスの文字が引用されていない場合、<チルダ>の後のチルダプレフィックス文字は、ユーザーデータベースで可能なログインとして扱われます。 [...]ログイン名が空の場合(つまり、チルダプレフィックスにチルダのみが含まれている場合)、チルダプレフィックスはHOME変数の値に置き換えられます。 HOME が設定されていない場合、結果は指定されません。 [...]
したがって、最も短い答えは「そう定義されているからです」です。引用符プレフィックス(~
、を含む)のすべての文字は拡張を抑制します。
また、常に単一の単語を生成するように拡張を定義するので、引用は必要ありません。
チルダ拡張で生成されたパス名は、フィールドの分割とパス名の拡張による変更を防ぐために引用符で囲む必要があります。
一部のパスには引用符が必要ですが、残りのパスにチルダプレフィックスが付いている場合は、チルダ拡張と一般的な引用符を直接組み合わせることができます。
$ cat ~/"file name with spaces"
より広い「理由」に関して:単語分割にはどのような用途にも使用できないため、引用を要求するのではなく、~
これがデフォルトの動作である必要があります。引用する必要がないので、~
引用符の中に特別な意味を与えることは不必要に複雑になります。もちろん、歴史的な理由からこれが望ましいとしても、今は変更できません。
答え3
~
Korn シェルに追加され、後で POSIX シェル仕様に追加される前に、C シェルに由来していました。
Cシェルではワイルドカードなので(たとえば、~
拡張と同じルーチンに拡張されます)、ワイルドカードの残りの部分は二重引用符内で実行されません。*.txt
答え4
これがなぜこのように設計されたのかという答えではありませんが、$HOME
交換が必要な場合はそれを使用できます。なぜならこれが本質的に~
することだからです。
$ echo "$HOME/some/path"
/home/braiam/some/path