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


37

これは単なる語彙の質問に過ぎませんが、私の頭の中で回り続けています。

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

しかし、この本にはタイプミスや間違いの名誉ある割合が含まれているので、そこに書かれているすべてを当然のこととは思いません。ここでは~、シェルによって変数のコンテンツ$HOMEまたは現在のユーザーのホームディレクトリパス(cf. man bash)に展開される変数として機能するため、実際のパス/home/myuser/Documentsは実際には絶対ディレクトリであるため、同意しません。

Wikipediaでさえ、このトピックに関して私には何の助けにもならないようです(たとえこの本でこの本が間違っていることを確認しているように見えても)。

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

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

ここでも、私は同意しません。この定義によれば/opt/kde3/bin/../lib、現在の作業ディレクトリに依存しないパスは絶対パスでなければなりません。

Webster Dictionaryによると、簡単なWeb検索は私の欲求不満に追加されているだけです。

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

それでは$HOME/Documents$HOME絶対ディレクトリとはみなされないでしょうか?または、この定義は変数の拡張を意味しますか?シェルの~キャラクターはどうですか?どこかにある相対ディレクトリと絶対ディレクトリの信頼できる定義はありますか?


7
すべてのパスは相対パスであり、それらの一部はルートディレクトリのみとの相対パスであり、/絶対パスと呼ばれます。したがってから始まるものをすべて/、私は(これがある場合でも、絶対呼ぶだろう/usr/../etc)と他のすべては、私は相対的な呼び出します(~/DocDoc../john/Doc$HOME/...、...)。ポイントは、現在の作業ディレクトリまたは現在のユーザーに関係なく、absoluteが動作する必要があるということです。相対は特定の狭いケースでのみ機能します。
jimmij

6
ユーザーが誰であるかに応じて、パスは別の場所に展開できます。そうは言っても、これはまだ相対パスではなく絶対パスです。絶対パスと相対パスの定義がそれほど正確に定義されているとは思いませんが。これは数学ではありません。この質問は、理解度を実際にテストするものではなく、無意味です。
ファヒムミタ

1
@FaheemMitha:LPICはディストリビューションに中立なLinux認定です。認定自体は問題ないように見えますが、これは自習としてこの試験の準備のために販売された書籍(少なくとも一部)の場合とはほど遠いです...
WhiteWinterWolf

2
@jimmij:「相対」には、パスのコンテキストで特定の技術的な意味があり、単語の英語の意味を変えることは悪い習慣です。~/foo相対パスを呼び出すことにまったく同意しません。あなたが得ているのは、ハードコーディングとパラメータ化の違いです。詳細については私の答えをご覧ください。
ピーターコーデス

1
ウェブスター辞書の定義は正しいが、非常に混乱している。ただし、~/Documentsやなどの文字列$HOME/Documentsはパスではないことを意味します。拡張後に(絶対)パスを識別しますが、パス自体ではありません。これはUnix / Linuxユーザーがこの用語を使用している数と一致すると思いますが、これらの文字列はパス自体と呼ばれることは間違いありません。
reinierpost

回答:


41

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


解決はプロセスの現在の作業ディレクトリに依存しないため、絶対パスです。 相対パスは、常にプロセスの作業ディレクトリへの相対を意味します。または、シンボリックリンクの場所に関連するシンボリックリンクターゲットの場合。(gcc -> gcc-5.2vs. 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を見たときに動作しますchroot(8)

すべてのUnixプロセスには独自のcwdがあります。pwdコマンドはちょうどそれを印刷するために存在します。

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


誰もが言ったよう~に、パスが何かに使用される前にシェルによって展開されます。~/bin/myprogシェルスクリプトで使用すると、ユーザーごとに動作が異なります。差~/bin/fooおよび/home/peter/bin/foo他がそれをパラメータ化していながら、そのうちの1つであるが、ハードコードされた位置を有しています。~バージョンを相対パスと呼ぶのはエラー(IMO)です。

「環境変数に関連する」ことについて話すのは、混乱させるだけです。使用しているコンテキストで特定の技術的意味を持つ用語の異なる英語の意味を使用することは悪い習慣です。

壊れたシステムではHOME=a/relative/path~/fooを使用して相対パスに展開します。これは使用可能なセットアップではありません。


3
この答えをありがとう、それは私にとって最も包括的なもののようです。また、著者はこれに標準的なパスの概念を誤って混同したという印象を持っています(著者はどこにも言及していません)。/opt/kde3/bin/../lib例えば誤って相対パスに分類される:それはある絶対パスが、ではない正規1。あなたが言ったように、これはすべてを混乱させるだけなので、説明とNFSに関連する情報に感謝します:)!
WhiteWinterWolf

1
私は、テスト準備の本を書くことはあまり楽しくなく、日常のコンピューティングにUnixまたはGNU / Linuxを使用するだけの人はそれらの本を書く人ではないと結論付けなければなりません。非標準パスの親族を呼び出すその例は、私にとって本当に悪いと明白なようです。 man7.org/linux/man-pages/man3/realpath.3.html(およびrealpath(1))は両方のことを行います:正規化と絶対化(およびシンボリックリンクの追跡)を行うため、混乱が生じる可能性があります。
ピーターコーデス

2
それでも、これらは私にとって日常的な概念にすぎません。自分が知っていると言った紙を持っているのは奇妙だと思う...しかし、あなたの紙@WhiteWinterWolfを手に入れて、紙を見るのが好きなすべての人に見せてください。:)
ピーターコーデス

48

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

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

~実装される構文であるシェル(利便性のためにそれを模倣し、他のプログラム)展開し、実際のパス名にそれを。説明のために、これ~/Documents$HOME/Documents(再び、シェル構文)とほぼ同じです。$HOME絶対パスである必要があるため、の値 $HOME/Documentsも絶対パスです。しかし、テキスト$HOME/Documentsまたは~/Documentsシェルは、意図したパスになるためにシェルによって展開される必要があります。

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


もちろん、カーネルは$HOME何を~意味するのか分からないように、カーネルは何を意味するのか分からないでしょう。ただし、〜の展開はシェルによって行われるという主張は疑わしいと思います。ほとんどのアプリケーションはこれをサポートします。これはシェルではなくCライブラリを指します。環境変数の展開しかしであるシェルの特徴。~/somefile.odtLibreOffice を開くことはできますが、$HOME/somefile.odt$ HOMEが適切に設定されているシェルからLibreOfficeを起動した場合でも、できません。
CVn

5
あなたはそれをあなたが望む怪しげなすべてを見つけることができますが、それはだ文書やC.で確認または反証に簡単にする必要があります
無駄

6
他のプログラムは~、便利なショートカットであるため、シェルを模した構文を実装しています。展開を行うライブラリ関数があるかどうかは実際にはわかりませんが、実際にはパス名を使用することとは別に行われます。
ケビンリード

2
globそしてwordexp、他のものの間でチルダ展開を行います。
o11c

2
@MichaelKjörling:いくつかのプログラムは~拡張を実装しています。ほとんどありません。たとえば、を入力するls -l ~と、lsプログラムは~文字を認識しません。ls呼び出される前にシェルによって展開されます。実際に~toを渡した場合ls、特別に扱われません。try ls -l '~'`(文字通りの名前のファイルをリストしようとします~
キーストンプソン

16

あなたの$HOMEがの/home/white/場合~/Documents(と同じ$HOME/Documents)はシェルによって展開され(説明はこちらを参照)/home/white/Documents、になります。これは絶対パスです。

相対パスは/、次のように(シェル展開後)で始まらないパスです。../Documentsまたはfoo/bar

いくつかの古いシェルが展開しません~(道をbashtcshzsh、など...ん)。それらは~/Documents~;で始まる相対パスと見なされます。ただし、通常は次のようなディレクトリ名はありません~(ただしmkdir '~'、で作成することはお勧めできません)。


どのシェルが膨張しないかを言及する必要があります~
エドワードトーバルズ

3

絶対パスで開始する/(それが固定されていることをいうもの)、相対パスの開始現在のディレクトリに(それが現在のディレクトリの変更などの変更を意味するものそう)。ほとんどのシェルが使用~すなわち、現在のユーザのホームディレクトリへの絶対パスの省略形として先頭に、~/DocumentsディレクトリであるDocumentsにかかわらず、現在のディレクトリが何であるかを、現在のユーザーのホームインチ したがって、それは絶対パスです。


1

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


定義は意見以上のものです。:ウィキペディアだけではなくUnixの、一般的なケースのためにそれで刺しを取るen.wikipedia.org/wiki/...
ピーター・コルド

1

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

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


-1

本は、絶対パスはで始まるパス/であり、相対パスはそれ以外のものであるという見方をしているようです。

あなたは、表示可能性がある..$HOMEトークン同様のタイプとして。パスが絶対パスに解決される前に、両方をパスコンポーネントに置き換える必要があります。


3
どの..ようなもの$HOMEですか? ..システムコールに直接渡されるパスの先頭に配置できます。シェルを展開する必要はありません。このようなパスは絶対パスではありません。プロセスのcwdまたはシンボリックリンクの場所に相対的です。作成者がそのリテラル文字列(シェル展開なし)をパスとして話してあなたをキャッチしようとしていない限り。あなたは本の言い訳をしようとしていると思いますが、私はそれが間違っていると言って、物事を混乱させないようにしたいと思っています。
ピーターコーデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.