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