ディレクトリパス変数は末尾にスラッシュを付ける必要がありますか?


85

ディレクトリへのパスを変数または定数として定義する場合、末尾にスラッシュを付ける必要がありますか?コンベンションとは何ですか?

pwdUnixでは、現在のディレクトリが末尾のスラッシュなしで表示さcd /var/www/apps/れますが、完全なタブには末尾のスラッシュが含まれているため、わかりません。

回答:


23

たとえば、ファイルを保存するためのディレクトリを定義する場合、末尾のスラッシュは含めません。それは私がそれを次のように使うからです

$store_file = "$store_path/$file_id";

ディレクトリパスを保持することになっている変数を使用する前に、常に末尾にスラッシュを追加します。末尾のスラッシュが含まれているかどうか疑問に思うよりも、常に1つ追加する方が良いと思います。


29
末尾にスラッシュがないということは、$ store_pathのパスがファイルなのかディレクトリなのかが不明確であることを意味します。「/ tmp / store_data」はファイルですか、それともディレクトリですか?
ダーウィン

4
PHPのrealpath()関数のようなものを使用する場合、末尾のスラッシュは出力されません。あなたのシステムとツールがあなたの慣習を決定するかもしれません。
jmbertucci 2012

10
通常、どこかに複数のスラッシュがあると、単一のスラッシュとして解釈されます。だからあなたはそのようなものを持つことさえでき'///' + $root + '//' + $file + '/'、それは問題ではないでしょう。最後のスラッシュを有するパスがファイルか、それはのようなパスに追加する方が良いだろうディレクトリであるかどうかを見分けるための良い方法ですが、'/' + $rootではなく$root + '/'、あなたがパスはに追加されたことを肯定することはできませんとしては、最後のスラッシュを持っています、ただし、ほとんどの環境では、複数のスラッシュが単一のスラッシュとして解釈されることを比較的確信できます。
xtrinity 2016年

3
@MatthewSlyman、私のポイントは、誰もがこれ/tmp/store_data/がディレクトリであることを期待し ているということでしたが、トロールスラッシュのない同じパスが何であるかは不明です/tmp/store_data
ダーウィン

6
これに伴う問題は次のとおりです。変数が存在しない場合、それは空と同じであり、でrm -rf $foo/$bar終わる可能性がありますrm -rf /
12431234123412341234123 2017

100

次の理由で、末尾のスラッシュを使用します。

  1. 「スラッシュで終わる場合はディレクトリです。そうでない場合はファイルです。」覚えやすい慣習です。

  2. 少なくとも私がよく使用するオペレーティングシステムでは、スラッシュを2倍にしても問題はありませんが、スラッシュを省略しても大きな問題は発生しません。したがって、スラッシュを変数に入れることと、それを使用するときに「$ path / $ file」を使用することの両方が最も安全です。


9
ディレクトリパスの末尾にスラッシュがある場合にのみ、ディレクトリパスをファイルパスと区別できます。
ダーウィン

4
パスが二重スラッシュで始まらない限り、複数のスラッシュは1つのスラッシュと同等です。unix.stackexchange.com/questions/1910
jdh8

4
さらに、vaariableの最後にスラッシュを追加すると、「$ path / $ file」の代わりに「$ path $ file」が可能になり、空の$ path(現在の作業ディレクトリを意味します)が可能になります。ただし、スラッシュの代わりにバックスラッシュを使用しないでください。
ファンタストリー2015

ファイル記述子も便利です
Francesco Gualazzi 2015

@ jdh8パスが二重スラッシュで始まっている場合でも、1つのスラッシュと同等である必要があります。これは実装ごとに変わる可能性がありますが。UNIX規格でA pathname that begins with two successive slashes may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash.は、ほとんどの場合、一般的な実装では、ダブルスラッシュは通常シングルスラッシュとして解釈されることが確認されています。
xtrinity 2016年

11

私はこれが10歳であることを知っています、しかし私は私の非常に意見のある$ 0.02を投入したかったです。

いいえ、いいえ。絶対にありません。

私たちはUnixシステムについて話している。ディレクトリ自体を参照すると、他のノードと同じようにノードです。ディレクトリを参照するときは、名前にエスケープされていないスラッシュを含めないでください(参照:dirnamepwd~echo $HOMEecho $PATH、からの出力lsら、)。

ディレクトリの内容を参照する場合、 その後、あなたはスラッシュが必要です。つまりls /home/karl/ls /home/karl(FTR、私はほとんどの場合後者を実行します。なぜなら...まあ、怠惰なので)よりも適切です。

ディレクトリを含む変数を使用してファイルへのフルパスを作成する場合、常にスラッシュ(つまり、:)を含める必要がありますcp ${HOME}/test ${OTHER_DIR}/

ディレクトリはスラッシュで終わらないことが期待されます。ディレクトリがスラッシュで終わるという期待は間違っています。したがって、*_DIR変数の値の末尾にスラッシュを追加すると、期待が覆されます。

タブ補完に関しては、ここでの期待は、そのディレクトリに移動することです。したがって、タブ補完によって提供される支援は、そのディレクトリに移動して、その内容に基づいて次の選択を行えるようにすることです。

(コメントからの参照:ウィキペディアのページからのファイルパスの誤解Talk:Path_(computing)。ありがとう、ジョンcj

それが間違っているからといって、ツール/パッケージ/ライブラリが決してそれをしないという意味ではないことは注目に値します。存在すべきでないときにそのようなものが末尾のスラッシュを追加することは、あまりにも一般的な出来事です。したがって、BevanPaul Fの両方が示唆したように、サードパーティのツールを使用する場合は、ディレクトリ名に存在する可能性のある末尾のスラッシュを削除するのが最善です。

Unixiノード

iノード(インデックスノード)は、ファイルやディレクトリなどのファイルシステムオブジェクトを記述するUnixスタイルのファイルシステムのデータ構造です。

- https://en.wikipedia.org/wiki/Inode

ファイルシステム階層標準

ザ・Unixファイルシステム標準(Filesystem Hierarchy Standard、AKA FHS)は、ディレクトリが末尾にスラッシュがあるとは考えられておらず、ディレクトリの内容がスラッシュで始まることを明確に示しています(これに対する唯一の例外は/、参照しないためです。空の文字列を使用したファイルシステムルート...そして、とにかくそこにファイルを作成してはいけません。)

- http://www.pathname.com/fhs/pub/fhs-2.3.html

- https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard


素晴らしい答え。私はこのアプローチを使用する傾向がありましたが、その理由について完全に完全なものではありませんでした。これはそれを釘付けにする唯一の答えです。
ワード

4
/パターンを壊すのはルートです。そして、ここから(再帰的に)推論を開始する場合は、(ここでの回答から明らかなように)分岐するプラクティスの中心にある可能性のある矛盾に到達することができます。しかし、これを例外として受け入れると、他のすべてが一致します。
ワード

そうですか。dirnameで少し遊んでみました。パスにディレクトリを明示的に保存する場合は、パスを「/。」で終了します。ドットは現在のディレクトリを表します。
TamusJRoyce

で終わることは決してありません/.。これはひどい考えです。非常に珍しいコンテンツを挿入すると予期しないトラブルが発生するだけでなく、見た目もばかげています。
カール・ウィルバー

2
@wardwは、ルートディレクトリの名前が空の文字列であると考えることができますが、「/」は空の文字列の後にスラッシュが続き、「ルートディレクトリの内容」を意味します。
bobpaul

9

はい、次のようにする必要があります。

パス名+ファイル名=完全修飾ファイルの場所。

したがって、最後のディレクトリとファイル名の間のスラッシュは、パス名の末尾またはファイル名の先頭にある必要があります。ファイル名の前に/を付けるということは、ファイルを開くだけの場合(つまり、修飾されていないファイル名が現在の作業ディレクトリにあると想定する場合)、これを考慮する必要があることを意味します。


5
..そしてそれを考慮に入れていないということは、あなたがうっかり/をいじっている可能性があることを意味し、そのように狂気があります
JustJeff 2009年

5

ディレクトリパスを保存したり、APIから返すときは常に、末尾にスラッシュを付けるという規則に固執します。これにより、ファイルまたはディレクトリのあいまいさ全体が回避されます。

補遺
これは、末尾のスラッシュまたはスラッシュがないことを許容できる方法を使用する代わりになることを意図したものではありません。この規則を使用しても、私は常にPath.Combine(...)同様の方法を使用します。


python:os.path.join(dir, subdir_or_file)
IceArdor 2017年

5

たぶん、あなたはあなたの決定がファイルにとって何を意味するかについて考える必要があります。ディレクトリ名の末尾にスラッシュを含めない場合は、ファイルの先頭にスラッシュを追加する必要があります名の。

さて、何らかの理由で、文字列を連結するときにファイルに至るパスが欠落していると、次のような結果になります。 /filename、ファイルだけでなく、ルートディレクトリからの絶対パス(そのコンテキスト内のどこでも)のようなものになります。 。

そのため、パスをスラッシュで終了し、ファイルをファイルとして保持します。


1
ここでの代替手段は、ファイル名をとして表現すること./filenameです。しかし、一般的には、パスを連結して適切に実行するのはコードの責任であり、どちらの方法でも仮定を行うことはできません。
ワード

4

私はこれが古いスレッドであることを知っていますが、私がしていることを共有したいと思いました。可能であれば、私は通常両方を許可し、次のようなことを行います(PHPの場合):

$fullPath = rtrim($directory, '/') . '/filename.txt');

そうすれば、ディレクトリが設定ファイルで定義されている場合、次に変更する人に末尾のスラッシュが含まれているかどうかは関係ありません。


4

phpでは、dirname(__ FILE __)関数は、末尾にスラッシュを付けずにディレクトリ名を返すためです。私はその慣習に固執する傾向があります。

そうしないと、ディレクトリ名の末尾にスラッシュを使用すると、dirname(..)の動作と競合し、ディレクトリ名がdirname(..)からのものかどうかわからないため、2つのケースの処理に行き詰まります。 )関数または末尾のスラッシュで定義されたコンテンツ。

結論: dirname(..)は使用しないため、末尾のスラッシュは使用しないでください。

// PHP Example
dirname(__FILE__); // returns c:\my\directory without a trailing slash, so stick to it!

他の言語の場合は、パス名を抽出する関数をチェックし、末尾のスラッシュが使用されているかどうかを確認してから、言語の規則に従ってください。


2
例外:dirname( '/ test')= '/' —この場合、dirnameは空の文字列を返すのではなく、単一のスラッシュを返します。こちらのメモをご覧ください
マシュースライマン2016


2

はい、拡張子のないファイルをサポートするファイルシステムはたくさんあるので、問題を回避するために常に末尾にスラッシュを追加してください。


1

どちらにしても、しっかりした大会を見たことがありません。

しかし、あなたが何を決めようとも、他の誰かがそれが逆であるべきだと100%確信していることはかなり確かです。したがって、最善のアイデアは、どちらの方法でも設定されることを許容することです。

.NETの世界では、Path.Combine()を使用すると、これを処理できます。他の環境には、cmdファイル以降の同等のものがあります。


1

これは、理論的にも実際的にも正しい答えが異なるまれなケースの1つだと思います。

ディレクトリノード自体への参照をディレクトリのコンテンツから区別できるはずなので、@ KarlWilburの答えは理論的な意味で確かに正しいようです。

しかし実際には、正解は反対であると主張します。

  • 最も重要な理由は、パスがフォルダであるのに対し、あいまいであることが確実にわかることです。これがフォルダのファイルかどうかは誰にもわかりません。仕様は、可能な限り常に正確で明確でなければなりません。/home/FSObjectX//home/FSObjectX

  • ほとんどの場合、dirノード自体ではなく、常にフォルダーのコンテンツを参照します。
    実際に行うまれなケースでは、オプションの末尾のdir-separatorを削除することで、コードで簡単に処理できます。

  • 二重のdir-separatorを使用しても害はありませんが、1つを使用しないと確実に害があります。
    理論的には「チャンス」でコーディングすべきではないので悪い議論ですが、実際にはエラーが発生し、おそらく末尾のdir-sepを使用すると、エンドユーザーでのランタイムエラーが数回少なくなる可能性があります。

この興味深いスレッドを読んでも、末尾のdir-sepを使用することの不利な点は見つかりませんでしたが、理論的な意味で間違っているだけです。それとも私は何かを逃しましたか?


実際には、適切な期待値は末尾のスラッシュを含まないことです。有能な開発者によって書かれた、使用するすべてのツールを見てください。
カールウィルバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.