Mary
がディレクトリであるとしましょう。次のパスです~/Mary
相対的?
いいえ、それは相対的ではありません。
これは、~
がエイリアスである完全パスです。
相対パスは、現在のディレクトリの場所に関連するパスを表します。ただし、現在どのディレクトリにいるかに関係なく、~/Mary
はまったく同じです。
現在Bobとしてログインしており、ディレクトリ/home/Bob
にもログインしているとすると、../Mary
は親戚の例になります/home/Mary
へのパス。現在/etc/something
にいる場合、~/Mary
は/home/Bob/Mary
のままですが、../Mary
は/etc/Mary
になります。
Bashは~
を特定の方法で処理し、常に$HOME
に変換されるわけではないことに注意してください。
詳細については、以下を参照してください。
その_~/Mary
_がシステムコールに与えられたパス(open()
、stat()
...など)である場合、それは相対パスであり、それに関連するMary
エントリです。現在のディレクトリの_~
_ディレクトリ。たとえば、現在のディレクトリが_/tmp
_の場合、それは_/tmp/~/Mary
_ファイルになります。
ただし、その_~/Mary
_がチルダ展開をサポートするシェル(または他のツール)で引用符なしで使用されている場合、その_~
_は_$HOME
_変数の内容で置き換えられます(設定されている場合) )、および_$HOME
_には通常_/home/me
_のような絶対パスが含まれるため、_~/Mary
_は_/home/me/Mary
_に展開されるため、絶対パスも同様です。
_$HOME
_を相対パスに変更した場合(ただし、そうしたくない場合)、_~/Mary
_はシェルによって相対パスに展開されます。
_$ HOME=..; echo ~/Mary
../Mary
_
_//foo
_に変更した場合(または、ホームディレクトリがroot
に共通であった_/
_であった場合)、_~/Mary
_の拡張は 絶対パス名 または (相対パス名 (少なくともPOSIX定義による)。
4.0より前のbash
バージョンを使用すると、次のような面白いこともできます。
_$ HOME='*' bash-3.2.48 -c 'cd /; echo ~/mount'
bin/mount run/mount
_
(それは4.0で修正されました)
nix&Linux に関する詳細情報
熟考しましょう。
他の人が述べたように、それはエイリアスです。そのため、厳密には絶対パスでも相対パスでもありません。実際には、作業ディレクトリからの相対パスではないため、絶対パスです。
詳細については、今。 OSレベルでは、エイリアスはサポートされていないため、すべての絶対パスがスラッシュで始まるという規則が成り立ち、それ以外はすべて相対パスです。ただし、アプリケーションは単に名前をカーネルに渡すだけではない場合があります。:
、~
および-
の特別な処理は一般的で、アプリケーションに依存します。 -
は、オプションを開始するために使用されるため、相対パスを使用して、ほとんどすべての場合に相対処理を強制するために./
を付加できます(唯一の例外がホスト名を含むホスト名であることがわかっている限り)。 rcp
またはscp
)の一部の実装ではスラッシュ。 :
の認識は、一部のコマンドのURLおよびリモートホストの検出に使用され、先頭の//
も特別な意味を持つ場合がありますが、これらのケースはすべてOSレベルではなくアプリケーションレベルの問題です。
ほとんどすべてのシェル(1つの例外は知っています)と多くのUnixアプリケーションは、基本的なチルダ拡張をサポートしています。機能する可能性が最も高い2つのチルド拡張は、~/path
(先頭のチルドが$HOME
変数の内容で置き換えられる)と~name/path
(ここでname
)です。ユーザーデータベースで検索され、ユーザーname
のホームディレクトリが検索されます)。ファンキーになるのは、ユーザーデータベースに絶対パスが含まれていない(そうしないでください)か、$HOME
に絶対パスが含まれていない(それもしないでください)場合です。チルド拡張の他の形式も存在する可能性があります。たとえば、Bashは~-
を以前の作業ディレクトリに展開します。これもすべてアプリケーションレベルで行われます(シェルはアプリケーションです)。
最も投票数の多い2つの回答(EightBitTonyとStéphane)は正しいです:~
は、シェルのエイリアス 現在のユーザーのホームディレクトリに展開される です。
すべてのUnixライクなシステムでは、ユーザーのホームディレクトリはユーザーデータベースで絶対パスとして指定されます(たとえば、/etc/passwd
は伝統的にローカルユーザーアカウントに使用されます)。
ただし、一部の回答とコメントは、用語absoluteおよびrelativeの定義に関して混乱しているようです。すべてのパスが(親ディレクトリまたは/
への)相対パスであるというポストモダンの解釈。
明確にするために、The Open GroupinPOSIX.1で指定された定義を引用する回答を追加すると便利だと考えました。 -2008(定義はステファンの回答にリンクされていますが、誰もがリンクをたどるわけではありません):
パス名 は次のように指定されます
ファイルを識別するために使用される文字列。
絶対パス名 は次のように指定されます。
1つまたは2つ以上の
<slash>
文字で始まるパス名
相対パス名 は次のように指定されます
<slash>
文字で始まっていないパス名。
また、POSIXシェルが~
を展開する方法は Tilde Expansion で指定されます。
はい、〜/ Maryは相対パスです。
この質問は定義の問題のようです。 絶対パスと相対パスの公式のシステム全体の定義が存在するかどうかはわかりません
「パス」には2つのタイプがあります:relativeおよびabsoluteです。絶対パスは常に同じリソースを指します。相対パスは、他のものに関連するリソースを指します。
〜を使用すると、通常、現在のユーザーのホームディレクトリに展開するために使用されます。ホームディレクトリは現在のユーザーに依存するため、〜/ Maryは現在のユーザーのホームディレクトリに対してrelativeです。
たとえば、~/Mary
はユーザーbobの場合は/home/bob/Mary
に展開され、ユーザーaliceの場合は/home/alice/Mary
に展開されます。
さらにいくつかの例
./ Maryは現在のディレクトリを基準にしています
../ Maryは親ディレクトリを基準にしています
〜/ Maryは現在のユーザーのホームディレクトリを基準にしています
メアリーは現在のディレクトリを基準にしています
/Maryはルートディレクトリを基準にしています。ルートディレクトリは固定されているため、これは絶対パスです
しかし、ルートディレクトリでさえ現在のホストに関連していると人々は主張するかもしれません。ホストをパスに追加すると、hostname:/ Maryになります。しかし、「ホスト名」はホスト名を定義するシステムからの相対パスであるため、これは実際には絶対パスではありません。
簡単な実験をさせてください:
[vttoth@Host ~]$ cd /tmp
[vttoth@Host tmp]$ mkdir "~"
[vttoth@Host tmp]$ mkdir "~/Mary"
[vttoth@Host tmp]$ ls -al "~"
total 12
drwxrwxr-x. 3 vttoth vttoth 17 Oct 12 20:24 .
drwxrwxrwt. 14 root root 8192 Oct 12 20:24 ..
drwxrwxr-x. 2 vttoth vttoth 6 Oct 12 20:24 Mary
[vttoth@Host tmp]$ cd "~/Mary"
[vttoth@Host Mary]$ pwd
/tmp/~/Mary
確かに一体は私に似ています。
ただし、bashシェルの場合(他の多くのシェルにも同じことが当てはまります)、
[vttoth@Host Mary]$ echo ~
/home/vttoth
~
は、シェルによって絶対パスに展開されます。
つまり、質問があいまいです。文字どおりの答えは"~/anything"
は相対パスですが、問題はシェルが~
記号(引用符の使用による展開から保護されていない場合)。
Bashのmanページのチルダ展開というタイトルのセクション、または優先シェルのmanページの対応するセクションを読むことをお勧めします。