ディレクトリへのパスを変数または定数として定義する場合、末尾にスラッシュを付ける必要がありますか?コンベンションとは何ですか?
pwd
Unixでは、現在のディレクトリが末尾のスラッシュなしで表示さcd /var/www/apps/
れますが、完全なタブには末尾のスラッシュが含まれているため、わかりません。
回答:
たとえば、ファイルを保存するためのディレクトリを定義する場合、末尾のスラッシュは含めません。それは私がそれを次のように使うからです
$store_file = "$store_path/$file_id";
ディレクトリパスを保持することになっている変数を使用する前に、常に末尾にスラッシュを追加します。末尾のスラッシュが含まれているかどうか疑問に思うよりも、常に1つ追加する方が良いと思います。
'///' + $root + '//' + $file + '/'
、それは問題ではないでしょう。最後のスラッシュを有するパスがファイルか、それはのようなパスに追加する方が良いだろうディレクトリであるかどうかを見分けるための良い方法ですが、'/' + $root
ではなく$root + '/'
、あなたがパスはに追加されたことを肯定することはできませんとしては、最後のスラッシュを持っています、ただし、ほとんどの環境では、複数のスラッシュが単一のスラッシュとして解釈されることを比較的確信できます。
/tmp/store_data/
がディレクトリであることを期待し ているということでしたが、トロールスラッシュのない同じパスが何であるかは不明です/tmp/store_data
rm -rf $foo/$bar
終わる可能性がありますrm -rf /
次の理由で、末尾のスラッシュを使用します。
「スラッシュで終わる場合はディレクトリです。そうでない場合はファイルです。」覚えやすい慣習です。
少なくとも私がよく使用するオペレーティングシステムでは、スラッシュを2倍にしても問題はありませんが、スラッシュを省略しても大きな問題は発生しません。したがって、スラッシュを変数に入れることと、それを使用するときに「$ path / $ file」を使用することの両方が最も安全です。
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.
は、ほとんどの場合、一般的な実装では、ダブルスラッシュは通常シングルスラッシュとして解釈されることが確認されています。
私はこれが10歳であることを知っています、しかし私は私の非常に意見のある$ 0.02を投入したかったです。
いいえ、いいえ。絶対にありません。
私たちはUnixシステムについて話している。ディレクトリ自体を参照すると、他のノードと同じようにノードです。ディレクトリを参照するときは、名前にエスケープされていないスラッシュを含めないでください(参照:dirname
、pwd
、~
、echo $HOME
、echo $PATH
、からの出力ls
ら、)。
ディレクトリの内容を参照する場合、 その後、あなたはスラッシュが必要です。つまりls /home/karl/
、ls /home/karl
(FTR、私はほとんどの場合後者を実行します。なぜなら...まあ、怠惰なので)よりも適切です。
ディレクトリを含む変数を使用してファイルへのフルパスを作成する場合、常にスラッシュ(つまり、:)を含める必要がありますcp ${HOME}/test ${OTHER_DIR}/
。
ディレクトリはスラッシュで終わらないことが期待されます。ディレクトリがスラッシュで終わるという期待は間違っています。したがって、*_DIR
変数の値の末尾にスラッシュを追加すると、期待が覆されます。
タブ補完に関しては、ここでの期待は、そのディレクトリに移動することです。したがって、タブ補完によって提供される支援は、そのディレクトリに移動して、その内容に基づいて次の選択を行えるようにすることです。
(コメントからの参照:ウィキペディアのページからのファイルパスの誤解Talk:Path_(computing)
。ありがとう、ジョンcj)
それが間違っているからといって、ツール/パッケージ/ライブラリが決してそれをしないという意味ではないことは注目に値します。存在すべきでないときにそのようなものが末尾のスラッシュを追加することは、あまりにも一般的な出来事です。したがって、BevanとPaul 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
/
パターンを壊すのはルートです。そして、ここから(再帰的に)推論を開始する場合は、(ここでの回答から明らかなように)分岐するプラクティスの中心にある可能性のある矛盾に到達することができます。しかし、これを例外として受け入れると、他のすべてが一致します。
/.
。これはひどい考えです。非常に珍しいコンテンツを挿入すると予期しないトラブルが発生するだけでなく、見た目もばかげています。
はい、次のようにする必要があります。
パス名+ファイル名=完全修飾ファイルの場所。
したがって、最後のディレクトリとファイル名の間のスラッシュは、パス名の末尾またはファイル名の先頭にある必要があります。ファイル名の前に/を付けるということは、ファイルを開くだけの場合(つまり、修飾されていないファイル名が現在の作業ディレクトリにあると想定する場合)、これを考慮する必要があることを意味します。
ディレクトリパスを保存したり、APIから返すときは常に、末尾にスラッシュを付けるという規則に固執します。これにより、ファイルまたはディレクトリのあいまいさ全体が回避されます。
補遺:
これは、末尾のスラッシュまたはスラッシュがないことを許容できる方法を使用する代わりになることを意図したものではありません。この規則を使用しても、私は常にPath.Combine(...)
同様の方法を使用します。
os.path.join(dir, subdir_or_file)
たぶん、あなたはあなたの決定がファイルにとって何を意味するかについて考える必要があります。ディレクトリ名の末尾にスラッシュを含めない場合は、ファイルの先頭にスラッシュを追加する必要があります名の。
さて、何らかの理由で、文字列を連結するときにファイルに至るパスが欠落していると、次のような結果になります。 /filename
、ファイルだけでなく、ルートディレクトリからの絶対パス(そのコンテキスト内のどこでも)のようなものになります。 。
そのため、パスをスラッシュで終了し、ファイルをファイルとして保持します。
./filename
です。しかし、一般的には、パスを連結して適切に実行するのはコードの責任であり、どちらの方法でも仮定を行うことはできません。
phpでは、dirname(__ FILE __)関数は、末尾にスラッシュを付けずにディレクトリ名を返すためです。私はその慣習に固執する傾向があります。
そうしないと、ディレクトリ名の末尾にスラッシュを使用すると、dirname(..)の動作と競合し、ディレクトリ名がdirname(..)からのものかどうかわからないため、2つのケースの処理に行き詰まります。 )関数または末尾のスラッシュで定義されたコンテンツ。
結論: dirname(..)は使用しないため、末尾のスラッシュは使用しないでください。
// PHP Example
dirname(__FILE__); // returns c:\my\directory without a trailing slash, so stick to it!
他の言語の場合は、パス名を抽出する関数をチェックし、末尾のスラッシュが使用されているかどうかを確認してから、言語の規則に従ってください。
ファイルの追加/取得にそのディレクトリを使用する可能性が高いため、末尾のスラッシュを追加する傾向があります...
Web参照に関しては、実際にはパフォーマンスが向上し、末尾のスラッシュが残ります。
これは、理論的にも実際的にも正しい答えが異なるまれなケースの1つだと思います。
ディレクトリノード自体への参照をディレクトリのコンテンツから区別できるはずなので、@ KarlWilburの答えは理論的な意味で確かに正しいようです。
しかし実際には、正解は反対であると主張します。
最も重要な理由は、パスがフォルダであるのに対し、あいまいであることが確実にわかることです。これがフォルダのファイルかどうかは誰にもわかりません。仕様は、可能な限り常に正確で明確でなければなりません。/home/FSObjectX/
/home/FSObjectX
ほとんどの場合、dirノード自体ではなく、常にフォルダーのコンテンツを参照します。
実際に行うまれなケースでは、オプションの末尾のdir-separatorを削除することで、コードで簡単に処理できます。
二重のdir-separatorを使用しても害はありませんが、1つを使用しないと確実に害があります。
理論的には「チャンス」でコーディングすべきではないので悪い議論ですが、実際にはエラーが発生し、おそらく末尾のdir-sepを使用すると、エンドユーザーでのランタイムエラーが数回少なくなる可能性があります。
この興味深いスレッドを読んでも、末尾のdir-sepを使用することの不利な点は見つかりませんでしたが、理論的な意味で間違っているだけです。それとも私は何かを逃しましたか?