web-dev-qa-db-ja.com

〜は$ HOMEですが、時には?

cd〜

同じことをする

cd $HOME

これも同じです

cd /home/tandu

しかしながら、

cd ~not-tandu

/home/not-tanduへの変更

これは純粋に構文上の選択ですか?これはカーネル(またはcd実行可能ファイル)によってどのように処理されますか?~にスラッシュを追加する特別なケースはありますか?つまり、~/~は同じディレクトリに移動しますが、~aは1つ上のディレクトリです。変更先の他のディレクトリについても同じことが言えません。

15
Explosion Pills

~は、いくつかのシェルによって提供される$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としてのみ利用可能でした。

19
penguin359

~fooは、「ユーザーfooのホームディレクトリ」を意味します。

これはカーネルによって行われるのではなく、シェルによって解釈されます。シェルが~fooを引数として認識すると、透過的にユーザーfooのホームディレクトリに置き換えられ、その場所に渡されます。したがって、cd ~tanduを実行すると、シェルは実際にcd /home/tanduを実行しています。

17
Patrick

~の後にユーザー名が続くと、そのユーザーのホームディレクトリに展開されます。