home$と〜$の違いは何ですか?

home$と〜$の違いは何ですか?

以下のスクリーンショットではわかりません。第三近道表2-1

cd ~user_name作業ディレクトリがホームディレクトリに変更されるとします。ユーザー名。ただし、このコマンドを入力すると同じディレクトリにあります。~$そしてそこにはありません。/家$。なぜ?

すべて同じですか?

正式なのはユーザーディレクトリで、後者はホームディレクトリのようです。

スクリーンショット

答え1

何を言っても~$家$/家$ あまり意味がありません。コマンドラインプロンプトについて話しているようです。その場合は、入力した内容と発生した内容を表示してから、予想される内容を説明すると便利です。

しかし、私は心を読むことができるので、次の質問を理解すると信じています。 ~そして〜ユーザー239887(そうだuser239887とするとあなたの実際のユーザー名)は同じ意味を持ちます。入りたい場合

cd ~gman

それが君をそこに連れて行くよ私のものホームディレクトリ、シェルプロンプトは次のとおりです。/home/gman$


最初に、シェルプロンプトは常に印刷文字と空白の2文字です。システム管理者の場合、プロンプトは「」で、そうでない場合は「」または「」です。それから神は「美しいシェルプロンプトがあるようにしなさい」と言われました。シェルプロンプトは、ユーザー名、システム名、時間、月の位相(冗談だと思いますか?)をすべて色で表示し始めます。

シェルプロンプトの最も広く使用されているカスタマイズの1つは、現在のディレクトリを含むことです。シェルプロンプトはおそらく現在のディレクトリの後ろに "」。

その他素晴らしいもの™ には「」と入力して、独自のホームディレクトリを指定できます。~したがって、現在のディレクトリがホームディレクトリで、シェルプロンプトが現在のディレクトリを表示するように設定されている場合、シェルプロンプトは "~「他の場所では実際のパス名が表示されます(表示されない限り」~gman「あなたはいつ私のものデフォルトディレクトリ、 /home/gman)。

あなたのホームディレクトリは/home/user239887前に述べたように 。~または〜ユーザー239887。ログインするとホームディレクトリにあるので、プロンプトは「~$ 「. 入力するとcd ../homeその後、ディレクトリに移動します。ホームディレクトリのディレクトリとプロンプトが「/home$ 」。

同じ言葉を繰り返す危険を冒して、いいえ/homeホームディレクトリではありません。あなたのホームディレクトリは/home/user239887。  /homeホームディレクトリのディレクトリです。

答え2

ユーザーがログインすると、通常は$HOME環境変数が設定され、loginユーザーのホームディレクトリのパス名としてエクスポートされます。 POSIX準拠のシェルは、次のタスクを実行する必要があるときにコンテキストでこの環境変数の値を使用します。~ ティルデ拡張してユーザーのホームディレクトリパスを完成させますが、実際の拡張フィールドは空です。シェルとの関連性に加えてティルデそれ以外の場合、拡張変数と/bin/loginシェル変数の例外はありません。これは、他のシェル変数と同様に、シェルによって処理されます。$HOMEシェルティルデしかし、拡張はシェル拡張がほとんどすべてに適用されるという点でユニークです。

最初は理解するのが少し難しいです。おそらくこれが理由です。ティルデより一般的な種類に悪影響を及ぼす傾向があるさまざまな種類のシェル拡張の脆弱性に免疫がありますが、その使用は十分に利用されません。

シェルはポータブルを考慮することができますティルデ次のいずれかの条件に該当する場合は、拡張を受けることができます。

  1. =シェル変数の割り当ての最初またはコロン文字の直後。
  2. シェル・パラメーター番号を開始します。
  3. シェルパスを起動し、正しく区切られた1つ以上の完全パスコンポーネントを単独で完了するか、後続のコンテキストを使用して確認できます。

このような場合でも~ ティルデ〜するいいえ参照されている場合、またはコンテキストが何らかの方法で拡張を妨げる場合は拡張できます。完全一部のユーザーのホームディレクトリまたは環境変数の現在の値$HOME。つまり、殻は〜しないだろう何かをするティルデ拡張の文脈が完全に不確実な場合は、拡張します。シェルはnullに拡張されますが、$var_not_var毎回同様の推測を拒否します~

$HOMEたとえば、交換は次の状況でのみ発生する可能性があります。ティルデの可能な拡張フィールドはnullです。つまり、パラメータリスト内の対応する位置はすべての点で区切られているため、拡張適格性を明確に保証します。

唯一の他の場合ティルデ後続のコンテキストが認証されたシステムユーザー名と正確に一致する場合、拡張できます。この場合、そのユーザーの割り当てられたホームディレクトリのシステムレポートパスに置き換えられます。シェルは、コンテキストをシステムに登録されているユーザーのリストと比較する必要があります。ただ後続のコンテキストが次のいずれかと一致する場合は展開します。

私が意味するものを明確にするために無効または空ではない ~拡張フィールドのいくつかの例は次のとおりです。

printf %s\\n ~some_user_name ~some_user_name/some_more_stuff

上記の拡張コンテキストはすべて次のとおりです。いいえnull - チルダはパス名にのみ拡張できます。一部のユーザー名のホームディレクトリであり、登録されたユーザ名が現在システムに存在する場合にのみ該当します。 2番目は~拡張する必要があります(または拡張しない)パス/区切り文字は末尾のコンテキストを分離するため、最初のものと同じです。シェルが存在するかどうかを確認できない場合一部のユーザー名だから~保存する必要がありますちょうどチルダ

printf %s\\n ~/some_user_name /~/ ~

しかし、ここに最初と3番目の拡張フィールドがあります。チルダは無効です。最初はパス区切り文字で区切られます。 2番目も同様に区切られていますが、シェル語を導入しないため、拡張は考慮されません。最初と3番目ティルデどちらも環境変数の現在の値に拡張する必要があり、$HOME拡張結果は次のようになります。

printf %s\\n "$HOME"/some_user_name /~/ "$HOME"

"$HOME"/some_user_name拡張のためにチルダを定義するために、上記のパスが実際に存在する必要はありません。前の例と同様に、これは~some_user_name/some_more_stuff移植可能なパス拡張の唯一の属性です。典型的なファイル名の生成またはシェルワイルドカード特殊なシェル文字を使用して試すことができる動作の1つ?[*は、その文字を拡張することです。マッチ解析されたパス名ですが、そうでない場合はそのままにしてください。これティルデしかしその代わりにあらかじめ指定された値 - - に規定されているように$HOME、延長資格が絶対的な場合にはマッチングが不可能です。

また、上記の引用は意図的なものです。~ ティルデ拡張は引用符の中には表示されず、拡張値は常にリテラルであり、追加のパス名拡張やどの種類のシェル分割にも影響されません。拡張すると、他のほとんどの拡張に引用符が必要なのと同じ方法で拡張されます。これは(非常に便利かもしれません)もちろん、$HOMEこれは実際の環境変数の拡張された動作とは対照的です。

さっきも暗示したように、~ ティルデ拡張が実行コマンドの区切られたパスコンポーネントを完了しない限り、拡張はパラメータまたは割り当てコンテキストでのみ発生できます。したがって、~通過した単一のコマンド位置は拡張されません。したがって、次のコマンドが実行されるように~シェルを割り当てることができます。alias

~ ~

...入力コンテキストに基づいて完全に処理される2つの独立した一意の拡張値を生成します。ユーザーは、呼び出された~ aliasときにシェル変数の値を定義し、2番目の変数$HOMEティルデ拡張子が最初に変更されました。(再帰の場合はその逆かもしれません)

実際、私は思うのが好きです。~ ティルデとしてパラメータエイリアス。私はしばしば$IFS拡張子 - との影響を受けない - と$*一緒に使用しますeval$IFS必要に応じて、単一の文字として単一の拡張機能を使用して文字列から完全に削除または発生するたびに他の文字に安全に置き換えることができるので、状況に適していると思います。パラメータの配列は次のとおりです。

"$argv1" ~ "$argv2" ~ "$argv3" ~

...可能(安全に)与えられた時間に多くの価値を$HOME私が望むものに一時的に再割り当てし、eval価値を与えます。これらのパラメータ配列は、代替アイテムを巧妙に適用して元のパラメータ区切り点の他の配列から生成することもできます$*

私が使用したい別の構造は次のとおりです。

for HOME in ./* ~; do stuff w/ $HOME and ~; done

...私をこうする二つ各反復に割り当てられた値。そのうちの1つを使用すると、グローバル文字を分割または追加するという形で即座に自由に解析を適用でき、もう1つを使用すると常に繰り返しの元のパラメータ$IFS値を文字通り参照できます。さらに、シェル引用符で複雑にすることなく、同じコマンドの引数リストでこれらの操作を並べて実行できます。

$HOMEとの違いを最も明確に示すのは、まさにこの最後のポイントだと思います~

答え3

シェルでユーザーのホームディレクトリは/home/username

~ホームディレクトリへのショートカットです現在のシェルユーザー、

~usrは、ユーザー名のユーザーホームディレクトリへのショートカットなusrので~usr、同じです/home/usr。ユーザー名がある場合、とはusr同じです。~~usr

現在のユーザーのホームディレクトリも変数に保存されます$HOME

関連情報