Linuxは複数の連続したパス区切り文字(/ home //// username /// file)をどのように処理しますか?


111

ファイルの場所をscpサブプロセスに渡すpythonスクリプトを作成しています。それで十分ですが、パスに二重の 'が含まれるように、パスとファイル名を連結する可能性/があります。複数のファイル区切り文字がある場合、bashは気にしないことを知っていますが、それがどのように正確に修正されるのか疑問に思っています。余分な/sを削除するのはbash ですか、それとも本当に重要ではありませんか?

/連結中に余分なs をチェックするために数行のコードが保存されるので、お願いします。大したことではないことは知っていますが、私も興味があります。私はcd //usr(ではなくcd /usr)行を持つbashスクリプトを持っていますが、これは/パスで複数のs を使用することに意味があるかもしれないことを暗示しているようです


7
余分なコード行に投資したい
Stefan

5
念のために誰もが、私は実際にはPythonの使用して終了でしたが、私は誰もいないと確信している、気にjoinしてabspathおよびそのようなコマンドを。
ファルマーリ

回答:


165

複数のスラッシュを使用でき、単一のスラッシュと同等です。シングルUnixの仕様(バージョン3) ベース定義§3.266パス名:「複数の連続したスラッシュは、一つのスラッシュと同じであると考えられます。」

例外が1つあります。パス名が正確に2つのスラッシュで始まる場合、異なる方法で処理される場合があります(参照:基本定義§4.11パス名の解決)。Linux自体はこれを行いませんが、一部のアプリケーションはそうするかもしれませんが、他のUnix系のシステムはそうします(例:Cygwin)。

/パス名の末尾の末尾は、パス名がディレクトリを参照するように強制します。(にPOSIX 1003.1-2001(シングルUnixのV3)ベース定義§4.11パス名解像度、トレーリングは、/トレーリングと等価である/.POSIX 1003.1から2008(単一のUnix V4)§4.12ベース定義にそれが同等作る必要性を除去する/.ために、存在しないディレクトリに対処するために(たとえばmkdir foo/、動作するために必要ですが、mkdir foo/.そうではない- 変更の理由を参照してください)。

ディレクトリエントリで動作するプログラムの場合、ディレクトリへfooのシンボリックリンクである場合、渡すことfoo/は、プログラムをシンボリックリンクではなくディレクトリで動作させる方法です。

¹ これは、パス名の解決、つまりファイルにアクセスする場合にのみ適用されることに注意してください。ファイル名の操作は異なる場合があります。たとえばbasenamedirname末尾のスラッシュを無視します。


7
に相当する/.ものは、あいまいだったため、後のディスカッションプロセスの後で削除されました。とにかく、この種の情報をうまくまとめて見つけたとして+1するのは難しい。
hakre

17

OSは、パスに//を指定して開くための直接のsyscallを使用してCプログラムを試しただけなので、気にしているようにも見えません。

ただし、Pythonライブラリ関数os.path.normpathを使用して正規化することができます。これにより、余分な文字列を探して文字列をスキャンする必要がなくなります。他の言語にも同様の機能があります。

http://docs.python.org/library/os.path.html#os.path.normpath


5
normpathのソースにある次のコメントに注意してください。パスを正規化します。たとえば、A // B、A /./ B、A / foo /../ BはすべてA / Bになります。シンボリックリンクが含まれている場合、これによりパスの意味が変わる可能性があることを理解してください!
ブルーホーン14年

8

私が見たすべてのUnixシステムでは、単一のものと同じです/が、Unix標準では

連続する2つのスラッシュで始まるパス名は、実装定義の方法で解釈できますが、2つ以上の先行スラッシュは単一のスラッシュとして扱われます。

システムに応じて特別に処理される場合があります。(一部の古いUnixバージョンでは、/リモートファイルシステムアクセスに二重のリードを使用していましたが、まだ使用しているものもあります。)


7
Cygwin(実際のUNIXではありません)は//remote/...、おそらくWindowsとの一貫性のために、リモートファイルシステムアクセスに変換されます\\remote\...
一時的な

2
Windows POSIX compat APIも//remote/...UNCパス\\remote\...形式と同じものを扱うと思います(ただし、すぐに適切なリファレンスを検索することはできません)。
スティーブンP

1
Boost.Filesystemの移植可能なパス名は、Unix / POSIX仕様に準拠していることを絶対的に//テストできるという点で、特別な方法で処理することを思い出すと思いますfalse

7

os.path.joinPythonで使用すると、複数のスラッシュを取得できません。文字列を連結して自分でファイル名を作成することは、Pythonスタイルとしては不十分と見なされます。


同意しますが、ファイル名はコマンド文字列の一部であり、コマンド文字列を解析してファイル名に(最後に)追加するのではなく、単に追加したいと思います。
ファルマーリ

1
@Falmarri:ファイル名をコマンド文字列に追加することはできません!コマンド文字列はシェルによって解析されるため、ファイル名の特殊文字は引用符で囲む必要があります。したがって、ファイル名を作成し、適切に引用してコマンド文字列に入れる必要があります。
ジル

これは非常に具体的なプロジェクトであり、私は自分自身を使用する予定です。私はおそらく、これについて頑健ではないことを正当化するほど明確ではなかったでしょう。正しくエスケープされたファイルパスなどを提供するクラスからこのファイルパス文字列を取得しています。そして、私はそれをコマンドライン引数に追加しています
-Falmarri

1
@Falmarri:したがって、normpathを使用して、制御できないコマンドライン値をクリーンアップし、次にjoinを使用してそれらをまとめます。
ニールメイヒュー

これは、実際に私がやったこと/です。
ファルマーリ

3

違いはありません。

複数のスラッシュは無視されます(効果なし)。例:

ls -al //usr///////bin/sed

7
そこができ、それはちょうど二つだと冒頭であれば可能。2つの連続したスラッシュで始まるパス名は、実装定義の方法で解釈される場合があります。実際に私は、これは正しいと思うし、彼らは単に無視されます
マイケルMrozek

クリス、ありがとうございます。(残念ながら、OpenIDログインは機能していません。または、投票します)

@Rob登録は解除されましたが、まだログインしています(Cookieによって追跡されています)。OpenIDをアカウントに接続するために今すぐ登録できるはずですが、どちらの方法でも投票できるはずです
Michael Mrozek

マイケルに感謝しますが、「投票するためにはログインするか登録する必要があります」。メールアドレスと名前だけを使用する場合、完全な権限はありません。また、OpenIDがタイムアウトになり、別のアカウントを作成する気にならないので、私は運が悪いです。私は怠け者だと思うが、助けてくれて感謝している。

0

もちろん、パスに複数の/(スラッシュ)を含めることでパスを正規化できます。 tr -s

NORMALIZED=$(echo "$UNHYGIENIC" | tr -s / /)

...そして使用する $NORMALIZED

しかし、それは必要なはずです。私が知っているように、UNIXカーネルは並行パスセパレータを無視する必要があります---または概念的にそれらを... /./...


「すべき」->「すべきではない」。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.