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

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

ただの単語帳なのに頭の中にずっと歩き回りました。

練習試験から出たんだリニアPIC本を準備してください。本によると、正解は、これが~/Documentsホームディレクトリに相対的であるため、相対ディレクトリであるということです。

しかし、この本には誤字や誤りが多すぎて、その中に書かれた内容を当然と考えることはできません。私はここに同意しません。~これは、シェルによって変数の内容または現在のユーザーのホームディレクトリへのパス$HOMEに拡張された変数として機能するためです(参照:man bash)、したがって実際のパスは/home/myuser/Documents実際には絶対ディレクトリです。

でもウィキペディア、今回はこのトピックについて私には何の役にも立たないようです(たとえそのトピックに関する本が間違っていることを確認するようですが)。

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

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

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

クイックウェブ検索が私の欲求不満を加えたそうです。マリアム - ウェブスター辞書:

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

もしそうなら、絶対ディレクトリと見なされませんか$HOME/Documents$HOMEそれとも、この定義は変数拡張を意味しますか?それでは、Shellの~性格はどうですか?相対ディレクトリと絶対ディレクトリの明確な定義をどこかで見つけることができますか?私はこれまで間違っていたのだろうか?

答え1

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

'~/Documents'に進むとシステムコール~、現在のディレクトリでフルネームのディレクトリを探します(失敗する可能性があります)。したがって、使用されたパス名の概念に応じてコア、これは相対パスですが、これは私たちが意味するものではありません。

~構文は次のように実装されます。シェル(および便宜上、これを模倣するその他のプログラム)拡大する実際のパス名になります。説明すると~/Documents(つまり、シェル構文)とほぼ同じです。絶対パスでなければならないので$HOME/Documents$HOMEの価値 $HOME/Documentsまた絶対パスです。しかし、私たちが参照するパスになるには、テキストをシェルで拡張する必要が$HOME/Documentsあります。~/Documents

したがって、正確で一貫して言いたい場合は、~/Documentsそうすると答えます。絶対パスに拡張されるシェルスクリプトの断片です。

答え2

作成者がリテラル文字列(シェル拡張なし)をパスとして扱ってユーザーを誘惑したい場合は、相対パス(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/whateverNFS が他の場所にマウントされたり、ing を使用せずに chroot を表示したりする場合にchroot(8)動作します。

各 Unix プロセスには独自の cwd があります。このpwdコマンドは単に印刷するために存在します。

望むより: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html POSIX システムコールを使用してディレクトリを変更する方法に関する追加情報。


他の人が言ったように、~このパスは何らかの目的で使用される前にシェルによって拡張されます。シェルスクリプトでこれを使用すると、~/bin/myprogユーザーごとに異なる動作をします。~/bin/fooとの違いは、/home/peter/bin/foo1つは場所をハードコーディングし、もう1つは場所をパラメータ化することです。バージョンを相対パスと呼ぶのは~間違っています(IMO)。

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

破損したシステムでは、使用は相対パスにHOME=a/relative/path拡張されます。~/fooこれは単に利用可能な設定ではありません。

答え3

あなたの$HOMEもので/home/white/あれば~/Documents(と同じ$HOME/Documents)シェルによって拡張されます(参照ここ説明を聞くため)に/home/white/Documents、これは純粋な道。

相対パスは、/または(シェル拡張後)で始まらないパスです。../Documentsfoo/bar

一部の古いシェルは拡張されていません~(たとえばbash、、、tcshなどzsh)。 ;で始まる相対パスとして扱われます~/Documents~ただし、通常、そのようなディレクトリ名はありません(ただし、推奨しないを~使用してディレクトリ名を作成できます)。mkdir '~'

答え4

ユーザーが誰であるかに応じて、パスが別の場所に拡張されることがあります。つまり、このパスは相対パスではなく絶対パスのようです。しかし、絶対パスと相対パスはそれほど正確に定義されていないと思います。これは数学ではありません。私の考えでは、この質問は実際の理解力テストではなく、無意味です。

関連情報