
ファイル パスの最後に / を残した場合、何が起こるかに違いがあるかどうか疑問に思っています。たとえば、次のようになります。
root /var/www/website.com/
省略すると次のようになります:
root /var/www/website.com
これはどのように処理されますか、それとも違いがありますか?
答え1
ディレクトリ名の後の末尾のスラッシュは、一部のプログラムでは重要であり、他のプログラムでは重要ではありません。例:
git では、
/
ファイル名の後ろはディレクトリのみを意味し、単一のファイルを意味するわけではありません ( からman 5 gitignore
):パターンがスラッシュで終わる場合、以降の説明のためにスラッシュは削除されますが、ディレクトリとの一致のみが検索されます。つまり、foo/ はディレクトリ foo とその下のパスと一致しますが、通常のファイルやシンボリック リンク foo とは一致しません (これは、git での pathspec の一般的な動作方法と一致しています)。
から
ls
ウィキペディア):ディレクトリを指すシンボリック リンクのディレクトリ リスト
が要求されると、リンク自体のみが表示されます。リンクされたディレクトリのリストを取得するには、パス の末尾にディレクトリ区切り文字 ('/'、スラッシュ) を含める
必要があります。しかし、今では思い出せない他のプログラム (主に私が見た Emacs マクロ) では、通常のファイルではなくディレクトリのみを期待しており、 と の両方を受け入れ、
dir
必要にdir/
応じて を追加します/
(たとえば、 内のファイルを参照する場合)dir
。
nginxがどのように動作するのかは分かりませんが、muruの答え。
答え2
一般的に、末尾にスラッシュがないパスはあいまいです。ファイルまたはディレクトリのどちらかである可能性があります。末尾にスラッシュがあるパスはディレクトリのみになります。ほとんどのシェルでは、タブ補完を使用すると末尾のスラッシュが自動的に表示されます。
これは、常に末尾のスラッシュを使用する必要があるという意味ではありません。実際、一部のプログラムではスラッシュの使用が禁止されています。他の人が述べたように、これはコンテキストによって異なります。各プログラムによって解釈が異なります。
末尾のスラッシュが大きな違いを生む例の 1 つは ですrsync
。
ディレクトリsource
とが指定されている場合target
、コマンドはrsync -a source target
すべてを にコピーしますtarget/source
。ただし、末尾にスラッシュを付けると、サブディレクトリを作成せずにrsync -a source/ target
のコンテンツがsource
にtarget
直接コピーされますtarget/source
。
私はこの動作によく困惑するので、暗黙的なサブディレクトリ作成に頼るのではなく、書き出すことを好みます。サブディレクトリが既に存在する/.
ため、不要なサブディレクトリが作成されないようにするために、末尾に付けることもあります.
。
答え3
コンテキストは非常に重要です。 の場合、 を場所としてnginx
指定しても、 はそれがディレクトリであることを知っているので、何の違いもありません。しかし、他の場所では違いが生じる可能性があります。root
nginx
二重スラッシュはURLに問題を引き起こす可能性がある(つまり、blah/$request_uri
書き換え中やプロキシ中など何かを行う場合)。
一般的に、*nix プラットフォームに関しては違いはありません。ただし、いくつか例外があります。
rsync
ソース ディレクトリ パスの末尾にスラッシュがあるかどうかによって動作が異なります。rsyncが末尾のスラッシュをどのように扱うかを示す良い例。末尾にスラッシュを追加すると、アプリケーションは誤ってファイルを作成するのではなく、ディレクトリを探していることを認識できるようになります。
cp blah non-existent-directory cp blah non-existent-directory2/
上記と同様に、グロブでは、ディレクトリのみへの拡張を強制するために使用できます。
$ printf "%s\n" * | wc -l 26 $ printf "%s\n" */ | wc -l 20
この例をお許しください。これは、かなり標準的な Ubuntu インストールのルートで実行されるため、この例の実行中に奇妙な名前が損なわれることはありません。
答え4
シェルに次のように入力した場合:
cd パス/somedir
現在のディレクトリを次の場所に移動しますパス/somedirただし、
次のように入力すると:
cd パス/somedir/
次のように印刷されます:
bash: cd: path/somedir/: そのようなファイルまたはディレクトリはありません
おそらく、この/
文字はパスが完全ではなく継続していることを意味しているため、その後に何も付けないと、存在しないファイルを参照するのと同じになります。