これはおそらく以前に尋ねられたことを知っていますが、Googleで見つけることができませんでした。
与えられた
- Linuxカーネル
- $ HOMEを変更する構成はありません
- バッシュ
ウィル~ == $HOME
真でありますか?
echo "~"
しecho "$HOME"
ます。
~
またはを引用していないことに気付くでしょう$HOME
。:P
これはおそらく以前に尋ねられたことを知っていますが、Googleで見つけることができませんでした。
与えられた
ウィル~ == $HOME
真でありますか?
echo "~"
しecho "$HOME"
ます。
~
またはを引用していないことに気付くでしょう$HOME
。:P
回答:
理解しておくべき重要なことは、~
展開はシェルの機能である(一部のシェルの)ことであり、ホームディレクトリを使用することを意味する魔法のキャラクターではありません。
$var
コマンドが実行される前にシェルコマンドラインで使用された場合、ある条件下でその値に展開されるように、コマンドラインを解釈するために使用されるアプリケーションであるシェルによって展開されます。
その機能は1970年代後半に最初にCシェルに登場し(ボーンシェルにはそれがなく、その前身であるトンプソンシェルもありませんでした)、後にKornシェルに追加されました(新しいシェルは、 80s)。最終的にはPOSIXによって標準化され、現在ではのような非POSIXシェルを含むほとんどのシェルで利用可能ですfish
。
シェルで非常に広く使用されているため、一部の非シェルアプリケーションもホームディレクトリを意味するものとして認識します。それは、その設定ファイルやその中で、多くのアプリケーションの場合だ独自のコマンドライン(mutt
、slrn
、vim
...)。
bash
具体的には(GNUプロジェクトのシェルであり、多くのLinuxベースのオペレーティングシステムで広く使用されています)、として呼び出されたsh
場合、ほとんどが拡張に関するPOSIXルールに従い、POSIXで~
指定されていない領域では、Kornシェル(これは一部のクローンです)。
一方で$var
、(内部の単一引用符を除く)ほとんどの場所で展開されている~
拡張、付け足しであることは唯一のいくつかの特定の条件に展開されます。
文字列が期待されるコンテキストで、リストコンテキストで独自の引数にある場合に展開されます。
展開された場所の例をいくつか示しbash
ます。
cmd arg ~ other arg
var=~
var=x:~:x
(変数に使用、POSIXによって要求好きPATH
、MANPATH
...)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 + ~ ))
extglob
:(case $var in @(~|other))...
ただしcase $var in ~|other)
大丈夫です)。./configure --prefix=~
(--prefix
有効な変数名ではないため)cmd "foo"=~
(bash
引用符のため、)。sh
:export "foo"=~
、env JAVA_HOME=~ cmd
...展開先について:変数~
のコンテンツHOME
、または設定されていない場合は、アカウントデータベース内の現在のユーザーのホームディレクトリのみに展開されます(POSIXはその動作を未定義のままにするため、拡張機能として)。
ksh88およびbash
4.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
($HOME
likeなどの値をカバーするため-
に+2
...)または単に:
cd
(cd
引数なしでホームディレクトリに移動します)
他のシェルには、より高度な~
拡張機能があります。たとえば、ではzsh
、次のものがあります。
~4
、~-
、~-2
(完成して)自分のディレクトリスタック(あなたがした場所にディレクトリを展開するために使用されるcd
前に)。~something
拡張方法を決定できます。どのシステムの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
が、完全を期すためにここで言及します。
/bin/sh
そうでない場合がありますbash
。Posixのsh
仕様が伝えているかどうかわからない~
~
。~
トムソンやボーンシェルではありませんでした(当時はとして利用可能でした/bin/sh
)。それは、rc
その派生物(他の何かに使用される場所)ではありません
bash
、HOME
が設定されていない場合~
、passwdデータベースからユーザーのホームディレクトリに展開されます。その~
ため、の値に展開できない場合があります$HOME
。
bash
bash4は、チルダ展開(TRY時グロブ実行するために使用する前にHOME='/*' bash -c 'echo /*'
)。そこでHOME=/*; [ "$HOME" = ~ ]
エラーが返されます。
~
と同等になると思い$HOME
ます。しかし、私は間違っている可能性があります。