web-dev-qa-db-ja.com

〜/ Maryは相対パスですか?

Maryがディレクトリであるとしましょう。次のパスです~/Mary 相対的?

36
Alex

いいえ、それは相対的ではありません。

これは、~がエイリアスである完全パスです。

相対パスは、現在のディレクトリの場所に関連するパスを表します。ただし、現在どのディレクトリにいるかに関係なく、~/Maryはまったく同じです。

現在Bobとしてログインしており、ディレクトリ/home/Bobにもログインしているとすると、../Maryは親戚の例になります/home/Maryへのパス。現在/etc/somethingにいる場合、~/Mary/home/Bob/Maryのままですが、../Mary/etc/Maryになります。

Bashは~を特定の方法で処理し、常に$HOMEに変換されるわけではないことに注意してください。

詳細については、以下を参照してください。

73
EightBitTony

その_~/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 に関する詳細情報

50

熟考しましょう。

他の人が述べたように、それはエイリアスです。そのため、厳密には絶対パスでも相対パスでもありません。実際には、作業ディレクトリからの相対パスではないため、絶対パスです。

詳細については、今。 OSレベルでは、エイリアスはサポートされていないため、すべての絶対パスがスラッシュで始まるという規則が成り立ち、それ以外はすべて相対パスです。ただし、アプリケーションは単に名前をカーネルに渡すだけではない場合があります。:~および-の特別な処理は一般的で、アプリケーションに依存します。 -は、オプションを開始するために使用されるため、相対パスを使用して、ほとんどすべての場合に相対処理を強制するために./を付加できます(唯一の例外がホスト名を含むホスト名であることがわかっている限り)。 rcpまたはscp)の一部の実装ではスラッシュ。 :の認識は、一部のコマンドのURLおよびリモートホストの検出に使用され、先頭の//も特別な意味を持つ場合がありますが、これらのケースはすべてOSレベルではなくアプリケーションレベルの問題です。

ほとんどすべてのシェル(1つの例外は知っています)と多くのUnixアプリケーションは、基本的なチルダ拡張をサポートしています。機能する可能性が最も高い2つのチルド拡張は、~/path(先頭のチルドが$HOME変数の内容で置き換えられる)と~name/path(ここでname)です。ユーザーデータベースで検索され、ユーザーnameのホームディレクトリが検索されます)。ファンキーになるのは、ユーザーデータベースに絶対パスが含まれていない(そうしないでください)か、$HOMEに絶対パスが含まれていない(それもしないでください)場合です。チルド拡張の他の形式も存在する可能性があります。たとえば、Bashは~-を以前の作業ディレクトリに展開します。これもすべてアプリケーションレベルで行われます(シェルはアプリケーションです)。

7
hildred

最も投票数の多い2つの回答(EightBitTonyとStéphane)は正しいです:~は、シェルのエイリアス 現在のユーザーのホームディレクトリに展開される です。

すべてのUnixライクなシステムでは、ユーザーのホームディレクトリはユーザーデータベースで絶対パスとして指定されます(たとえば、/etc/passwdは伝統的にローカルユーザーアカウントに使用されます)。

ただし、一部の回答とコメントは、用語absoluteおよびrelativeの定義に関して混乱しているようです。すべてのパスが(親ディレクトリまたは/への)相対パスであるというポストモダンの解釈。


POSIX仕様の定義

明確にするために、The Open GroupinPOSIX.1で指定された定義を引用する回答を追加すると便利だと考えました。 -2008(定義はステファンの回答にリンクされていますが、誰もがリンクをたどるわけではありません):

パス名 は次のように指定されます

ファイルを識別するために使用される文字列。

絶対パス名 は次のように指定されます。

1つまたは2つ以上の<slash>文字で始まるパス名

相対パス名 は次のように指定されます

<slash>文字で始まっていないパス名。

また、POSIXシェル~を展開する方法は Tilde Expansion で指定されます。

4

はい、〜/ Maryは相対パスです。

この質問は定義の問題のようです。 絶対パス相対パスの公式のシステム全体の定義が存在するかどうかはわかりません

「パス」には2つのタイプがあります:relativeおよびabsoluteです。絶対パスは常に同じリソースを指します。相対パスは、他のものに関連するリソースを指します。

〜を使用すると、通常、現在のユーザーのホームディレクトリに展開するために使用されます。ホームディレクトリは現在のユーザーに依存するため、〜/ Maryは現在のユーザーのホームディレクトリに対してrelativeです。

たとえば、~/Maryはユーザーbobの場合は/home/bob/Maryに展開され、ユーザーaliceの場合は/home/alice/Maryに展開されます。

さらにいくつかの例
./ Maryは現在のディレクトリを基準にしています
../ Maryは親ディレクトリを基準にしています
〜/ Maryは現在のユーザーのホームディレクトリを基準にしています
メアリーは現在のディレクトリを基準にしています
/Maryはルートディレクトリを基準にしています。ルートディレクトリは固定されているため、これは絶対パスです

しかし、ルートディレクトリでさえ現在のホストに関連していると人々は主張するかもしれません。ホストをパスに追加すると、hostname:/ Maryになります。しかし、「ホスト名」はホスト名を定義するシステムからの相対パスであるため、これは実際には絶対パスではありません。

2
anneb

簡単な実験をさせてください:

[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ページの対応するセクションを読むことをお勧めします。

1
Viktor Toth