〜は常に$ HOMEに等しい


40

これはおそらく以前に尋ねられたことを知っていますが、Googleで見つけることができませんでした。

与えられた

  • Linuxカーネル
  • $ HOMEを変更する構成はありません
  • バッシュ

ウィル~ == $HOME真でありますか?


3
私はそう信じていますが、これはLinux固有の問題ではありません。むしろ、POSIX環境~と同等になると思い$HOMEます。しかし、私は間違っている可能性があります。
HalosGhost 14

4
以下の答えにもかかわらず...常にではありません。とを比較echo "~"echo "$HOME"ます。
スパラフーク14

@Sparhawk待って、だから1 + 1 2じゃない?それは陰謀です!政府は私たちから何かを隠しています!:P
ドアノブ14

1
@Sparhawk、あなたはOPが実際に~またはを引用していないことに気付くでしょう$HOME。:P
HalosGhost 14

2
@HalosGhostああ、良い点。(また、マイケル・ホーマーの答えが「引用されていない単一の」に言及していることに後で気付きました~。)とにかく、私のようなカジュアルな読者のために心に留めておくべき何か。
スパラフーク14

回答:


46

理解しておくべき重要なことは、~展開はシェルの機能である(一部のシェルの)ことであり、ホームディレクトリを使用することを意味する魔法のキャラクターではありません。

$varコマンドが実行される前にシェルコマンドラインで使用された場合、ある条件下でその値に展開されるように、コマンドラインを解釈するために使用されるアプリケーションであるシェルによって展開されます。

その機能は1970年代後半に最初にCシェルに登場し(ボーンシェルにはそれがなく、その前身であるトンプソンシェルもありませんでした)、後にKornシェルに追加されました(新しいシェルは、 80s)。最終的にはPOSIXによって標準化され、現在ではのような非POSIXシェルを含むほとんどのシェルで利用可能ですfish

シェルで非常に広く使用されているため、一部の非シェルアプリケーションもホームディレクトリを意味するものとして認識します。それは、その設定ファイルやその中で、多くのアプリケーションの場合だ独自のコマンドライン(muttslrnvim...)。

bash具体的には(GNUプロジェクトのシェルであり、多くのLinuxベースのオペレーティングシステムで広く使用されています)、として呼び出されたsh場合、ほとんどが拡張に関するPOSIXルールに従い、POSIXで~指定されていない領域では、Kornシェル(これは一部のクローンです)。

一方で$var、(内部の単一引用符を除く)ほとんどの場所で展開されている~拡張、付け足しであることは唯一のいくつかの特定の条件に展開されます。

文字列が期待されるコンテキストで、リストコンテキストで独自の引数にある場合に展開されます。

展開された場所の例をいくつか示しbashます。

  • cmd arg ~ other arg
  • var=~
  • var=x:~:x(変数に使用、POSIXによって要求好きPATHMANPATH...)
  • for i in ~
  • [[ ~ = text ]]
  • [[ text = ~ ]]~AT&T kshではパターンとして解釈されるがbash、4.0以降ではないという拡張)。
  • case ~ in ~) ...
  • ${var#~} (ただし、他のいくつかのシェルにはありません)
  • cmd foo=~(ただし、として呼び出されたときではなくsh、左側にあるもの=が引用符で囲まれていないbash変数名のように形作られているときのみ)
  • cmd ~/x (明らかにPOSIXで必要)
  • cmd ~:x(ただし、x:~:xまたはx-~-x
  • a[~]=foo; echo "${a[~]} $((a[~]))" (他のシェルではない)

展開されていないいくつかの例を次に示します。

  • echo "~" '~'
  • echo ~@ ~~~uユーザーのホームディレクトリに展開することも意図されていることに注意してくださいu)。
  • echo @~
  • (( HOME == ~ ))$(( var + ~ ))
  • with extglob:(case $var in @(~|other))...ただしcase $var in ~|other)大丈夫です)。
  • ./configure --prefix=~--prefix有効な変数名ではないため)
  • cmd "foo"=~bash引用符のため、)。
  • として呼び出された場合shexport "foo"=~env JAVA_HOME=~ cmd...

展開先について:変数~のコンテンツHOME、または設定されていない場合は、アカウントデータベース内の現在のユーザーのホームディレクトリのみに展開されます(POSIXはその動作を未定義のままにするため、拡張機能として)。

ksh88およびbash4.0より前のバージョンでは、チルダ展開がリストコンテキストでグロビング(ファイル名生成)を受けていたことに注意する必要があります。

$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~

通常の場合、これは問題になりません。

展開されているため、他の形式の展開と同じ警告が適用されることに注意してください。

cd ~

コンポーネントで$HOME始まる-か、..コンポーネントが含まれている場合は機能しません。そのため、厳密に言えば、違いが生じることはほとんどありませんが、次のように記述する必要があります。

cd -P -- ~

あるいは:

case ~ in
  (/*) cd -P ~;;
  (*) d=~; cd -P "./$d";;
esac

$HOMElikeなどの値をカバーするため-+2...)または単に:

cd

cd引数なしでホームディレクトリに移動します)

他のシェルには、より高度な~拡張機能があります。たとえば、ではzsh、次のものがあります。

  • ~4~-~-2(完成して)自分のディレクトリスタック(あなたがした場所にディレクトリを展開するために使用されるcd前に)。
  • 動的な名前付きディレクトリ。独自のメカニズムを定義して、~something拡張方法を決定できます。

25

どのシステムのBashのどのバージョンでも、はい~用語自体が次のように展開されるように定義されているため:

$ HOMEの値

そのため、常に$HOME現在のシェルと同じものになります。そこのような他のいくつかのチルダ展開、ある~userためuserのホームディレクトリは、しかし、単一引用符で囲まれていない~自分自身ではいつもに展開されます"$HOME"

注意行動~とは$HOMEいくつかのケースでは異なる場合があります。特に、場合は$HOME、スペース(または他の含まれているIFSの文字)、その後、$HOME一方で(引用符で囲まれていない)は、複数の単語に展開されます~常に単一の言葉です。(引用符で囲まれた)~と同等に展開し"$HOME"ます。

特定の質問に関して:

[[ $HOME == ~ ]]

単語分割を[[ 抑制するため、常にtrue です。パターン一致文字が含まれて[[ ~ == $HOME ]いる場合HOMEはそうではありませんが、(つまり、quoted )は常にtrueです。単一の括弧内で使用すると、スペースまたは特殊文字を含む値の構文エラーになる可能性があります。任意の賢明なホームディレクトリ構成の場合と同じと等しいと比較されています。[[ ~ == "$HOME" ]]"$HOME"HOME~"$HOME"


ステファンChazelasは、コメント欄で指摘している場合~$HOME異なる値を与えた:あなたがあればunset HOME、あなたが使用している場合、その後、~バッシュが呼び出すgetpwuidパスワードデータベースの値を読み出します。このケースは、構成を変更しないという条件によって除外されます$HOMEが、完全を期すためにここで言及します。


1
ただし、/bin/shそうでない場合がありますbash。Posixのsh仕様が伝えているかどうかわからない~
バジルStarynkevitch 14

1
POSIXは指定します~~トムソンやボーンシェルではありませんでした(当時はとして利用可能でした/bin/sh)。それは、rcその派生物(他の何かに使用される場所)ではありません
ステファンシャゼル14

5
を含むいくつかのシェルではbashHOMEが設定されていない場合~、passwdデータベースからユーザーのホームディレクトリに展開されます。その~ため、の値に展開できない場合があります$HOME
ステファンシャゼル14

1
なおbashbash4は、チルダ展開(TRY時グロブ実行するために使用する前にHOME='/*' bash -c 'echo /*')。そこでHOME=/*; [ "$HOME" = ~ ]エラーが返されます。
ステファンシャゼル14

4
@cuonglmソースコードを確認しました。それは最終的に 呼び出して get_current_user_infoいる、使用するgetpwuidすべてのプラットフォームが、タンデムで
マイケルホーマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.