これはおそらく以前に尋ねられたことがあると思いますが、Googleでは見つかりませんでした。
与えられた
- Linuxカーネル
- $HOMEを変更する構成はありません
- バッシュ
〜==$ HOME
本当ですか?
承認された回答:
理解しておくべき重要なことは、〜
拡張は(一部のシェルの)シェルの機能であり、使用されている場所に関係なくホームディレクトリを意味する魔法のキャラクターではありません。
$ var
のように(コマンドラインを解釈するために使用されるアプリケーションであるシェルによって)拡張されます。 コマンドが実行される前にシェルコマンドラインで使用されると、特定の条件下でその値に展開されます。
この機能は、1970年代後半にCシェルに最初に登場し(Bourneシェルにはありませんでしたし、その前身であるThompsonシェルもありませんでした)、後にKornシェル(Bourneシェルに基づいて構築された新しいシェル)に追加されました。 80年代)。最終的にPOSIXによって標準化され、 fish
などの非POSIXシェルを含むほとんどのシェルで使用できるようになりました。 。
シェルで広く使用されているため、シェル以外のアプリケーションの中には、ホームディレクトリを意味するものとして認識しているものもあります。これは、構成ファイルまたは独自のにある多くのアプリケーションの場合です。 コマンドライン( 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&Tksh
でパターンとして採用されている ただし、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
の値をカバーするため -
のように 、 +2
…)または単に:
cd
( cd
として 引数なしでホームディレクトリに移動します)
他のシェルには、より高度な〜
があります 拡張。たとえば、 zsh
、あります:
-
〜4
、〜-コード> 、
〜-2
(完了後)ディレクトリスタック(cd
を使用した場所)のディレクトリを拡張するために使用されます 前に)。 - 動的な名前付きディレクトリ 。独自のメカニズムを定義して、
〜something
の方法を決定できます。 拡大中です。