cd〜
同じことをする
cd $HOME
これも同じです
cd /home/tandu
しかしながら、
cd ~not-tandu
/home/not-tandu
への変更
これは純粋に構文上の選択ですか?これはカーネル(またはcd
実行可能ファイル)によってどのように処理されますか?~
にスラッシュを追加する特別なケースはありますか?つまり、~/
と~
は同じディレクトリに移動しますが、~a
は1つ上のディレクトリです。変更先の他のディレクトリについても同じことが言えません。
~
は、いくつかのシェルによって提供される$HOME
のエイリアスですが、$HOME
はより一般的です。 $HOME
は実際に、シェルに環境変数HOMEをここに挿入(置換)するように要求します。置換できるさまざまな環境変数が多数あります。リストを取得するには、env
を実行してみてください。 ~
は、Wordの先頭にない場合は常に認識されないことに注意してください。比較のために次の2つのコマンドを試してください。
ls /~
ls /$HOME
最初のものは/~
としてls実行可能ファイルに渡され、次にルートディレクトリで~
というファイルを参照しようとします。2つ目は$HOME
を展開し、//home/user
になります。次に、コマンドライン引数としてls実行可能ファイルに渡されます。すべてのPOSIXシステム(POSIXはUNIXおよびLinuxシステムの動作の標準です)では、複数のスラッシュを1つのスラッシュと同じように扱うことができるため、//home/user
は/home/user
と同じです。 ~username
は、シェルにpasswdファイルでユーザー名を検索し、ホームディレクトリを返すように指示するショートカットです。同等の環境変数はありません。これらの置換はすべてシェルによって行われ、ほとんどがサポートしていますが、$HOME
のような環境変数のみがすべてのシェルでサポートされていることが保証されています。また、cd
は実際には組み込みコマンドです。これは、シェル自体にディレクトリを変更するように指示する特別なディレクティブです。これは、シェルプロセスの基本的な属性を変更するために使用されるため、echo
のような個別の実行可能ファイルとして実装できる他のシェル組み込みのようではありません。 echo
は、単にパフォーマンス上の理由から組み込みのシェルですが、UNIXの古き良き時代には、独自の実行可能ファイル/bin/echo
としてのみ利用可能でした。
~foo
は、「ユーザーfooのホームディレクトリ」を意味します。
これはカーネルによって行われるのではなく、シェルによって解釈されます。シェルが~foo
を引数として認識すると、透過的にユーザーfoo
のホームディレクトリに置き換えられ、その場所に渡されます。したがって、cd ~tandu
を実行すると、シェルは実際にcd /home/tandu
を実行しています。
~
の後にユーザー名が続くと、そのユーザーのホームディレクトリに展開されます。