web-dev-qa-db-ja.com

`〜/ Documents`は相対パスですか、絶対パスですか?

これは単なる語彙の質問ですが、私の頭の中を回っています。

これは [〜#〜] lpic [〜#〜] 準備本の模擬試験から来ています。本によると、正しい答えは、~/Documentsはホームディレクトリに相対的であるため、相対的なディレクトリであるということです。

しかし、この本にはタイプミスとミスの立派な比率が含まれているので、そこに書かれているすべてを当たり前のように考えることはできません。 ~は、シェルによって$HOME変数のコンテンツまたは現在のユーザーのホームディレクトリパス(cf. man bash )なので、実際のパスは/home/myuser/Documentsであり、これは実際には絶対ディレクトリです。

Wikipedia でも、このトピックについては、私には何の役にも立たないようです(たとえ本がこのトピックについて間違っていることを確認しているように見えても):

絶対パスまたは完全パスは、現在の作業ディレクトリに関係なく、ファイルシステムの同じ場所を指します。そのためには、ルートディレクトリが含まれている必要があります。

対照的に、相対パスは特定の作業ディレクトリから始まるため、完全な絶対パスを指定する必要がありません。

ここでも、私は同意しません。この定義によれば、現在の作業ディレクトリに依存しないパス/opt/kde3/bin/../libは絶対パスである必要がありますが、これに対する私の現在の理解は、このパスを相対にする本の著者と一致します1。

Webster Dictionary によると、クイックWeb検索は私の欲求不満に追加されています。

絶対パス-ルートディレクトリからの相対パス。最初の文字はパス名の区切り文字でなければなりません。

したがって、$HOME/Documentsまたは$HOMEだけを絶対ディレクトリと見なすことはできませんか?または、この定義は変数の拡張を意味しますか?シェルの~文字はどうですか?どこかで見つけることができる相対ディレクトリと絶対ディレクトリの信頼できる定義はありますか?

37
WhiteWinterWolf

そのリテラル文字列(シェル展開なし)をパスとして話すことで作成者があなたを見つけようとした場合、それは相対パス(_mkdir -p './~/Documents'_)です。さもないと:


それは 絶対パス です。これを解決するのはプロセスの現在の作業ディレクトリに依存しないためです。 相対パスは、常にプロセスの作業ディレクトリに対する相対パスを意味します。または、シンボリックリンクの場所を基準にして、シンボリックリンクターゲットの場合。 (_gcc -> gcc-5.2_対_gcc -> /usr/bin/gcc-5.2_)。これは、NFSマウントや、異なる絶対パスを介して同じシンボリックリンクに到達できるその他の場合に重要です。例えば.

_/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.
_

Debianは、絶対的なシンボリックリンクターゲットではなく_../../doc/whatever/whatever_へのシンボリックリンクをインストールする場合があるため、NFSが別の場所にマウントされている場合、またはchroot(8) ingを使用せずにchrootを参照する場合に機能します。

すべてのUnixプロセスには独自のcwdがあります。 pwdコマンドは、印刷するためだけに存在します。

pOSIXシステムコールでディレクトリを変更する方法の詳細については、 http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html を参照してください。


他の誰もが言ったように、_~_は、パスが何かに使用される前にシェルによって展開されます。シェルスクリプトで_~/bin/myprog_を使用すると、ユーザーごとに動作が異なります。 _~/bin/foo_と_/home/peter/bin/foo_の違いは、一方がロケーションをハードコーディングし、もう一方がパラメータ化したことです。 _~_バージョンを相対パスと呼ぶのはエラー(IMO)です。

「環境変数に関連している」といえば、混乱を招くだけです。使用している文脈で特定の技術的な意味を持つ用語の異なる英語の意味を使用することは悪い習慣です。

壊れたシステムでは、_HOME=a/relative/path_を使用すると、_~/foo_は相対パスに展開されます。これはまったく使用可能なセットアップではありません。

41
Peter Cordes

これは基本的に用語の定義に関する質問です。したがって、あなたの目的のために、答えはLPICが望むものです。しかし、技術的な事実に基づいていくつかの結論に達することができます。

'~/Documents'システムコールに渡した場合、現在のディレクトリで~という名前のディレクトリが検索されます(おそらく失敗します)。したがって、カーネルで使用されるパス名の概念では、これは相対パスですが、これは意図したものではありません。

~は、Shell(および、便宜上それを模倣する他のプログラム)によって実装される構文であり、expands 実際のパス名に変換します。例として、~/Documents$HOME/Documentsとほぼ同じです(ここでもシェル構文)。 $HOMEは絶対パスであるため、$HOME/Documentsの値も絶対パスです。ただし、テキスト$HOME/Documentsまたは~/Documentsは、シェルが展開して、目的のパスになる必要があります。

したがって、正確で一貫性を保ちたい場合、~/Documentsは絶対パスに展開されるシェルスクリプトのフラグメントであると言います。

48
Kevin Reid

_$HOME_が_/home/white/_の場合、_~/Documents_(_$HOME/Documents_と同じ)がシェルによって展開されます(説明は ここ を参照)から_/home/white/Documents_、absoluteパスです。

相対パスは、_/_または_../Documents_のように、_foo/bar_(シェル展開後)で始まらないパスです。

一部の古いシェルは_~_を拡張しません(bashtcshzshなど...を展開します); _~/Documents_は、_~_で始まる相対パスと見なされます。ただし、通常、_~_のようなディレクトリ名はありません(ただし、_mkdir '~'_で作成することもできますが、お勧めしません)。

16

絶対パス/で始まります(それが参照するものは固定されています)、相対パスは現在のディレクトリで始まります(したがって、参照するものは次のように変更されます現在のディレクトリが変更されます)。ほとんどのシェルは、現在のユーザーのホームディレクトリへの絶対パスの省略形として、最初に~を使用します。つまり、~/Documentsは、現在のユーザーのホームのディレクトリDocumentsです。 、現在のディレクトリが何であるかに関係なく。したがって、これは絶対パスです。

3
vonbrand

パスは、ユーザーがだれであるかに応じて、別の場所に展開する可能性があります。とは言っても、これは相対パスではなく絶対パスです。ただし、絶対パスと相対パスの定義がそれほど正確に定義されているとは思いません。これは数学ではありません。この質問は、私の意見では、理解を実際にテストするものではなく、無意味です。

1
Faheem Mitha

(定義により)ドキュメントを検索できるかどうかは現在の場所に依存しないため、最初に〜/を使用するとパスが絶対パスになります。ただし、拡張はカーネルではなくシェルによって行われるため、この構文を認識しないシェル(/ bin/sh、元のBourneシェル、bashエイリアスではないなど)を使用している場合は、幸運。

興味深いことに、〜/ではなく〜root /を使用する場合、$ HOMEの読み取りの最適化は通常適用されず、/ etc/passwdが正しい場合は常に絶対パスに解決されます。

1
jrrk