it-swarm-ru.tech

Как Linux обрабатывает несколько последовательных разделителей пути (/ home //// username /// file)?

Я работаю над сценарием python), который передает местоположения файлов в подпроцесс scp. Все нормально, но я нахожусь в ситуации, когда я могу конкатенировать путь с именем файла, так что есть двойной '/ в пути. Я знаю, что bash не волнует, если у вас есть несколько разделителей файлов, но мне интересно, как именно это исправить. Это bash, который лишает лишних /s или это действительно не имеет значения когда-либо?

Я спрашиваю, потому что это сэкономит мне несколько строк кода, чтобы проверить дополнительные /s при объединении. Я знаю, что это не имеет большого значения, но мне тоже любопытно. У меня есть сценарий Bash, который имеет строку cd //usr (вместо cd /usr), что, по-видимому, предполагает использование нескольких /s в пути

117
Falmarri

Допускается несколько косых черт, которые эквивалентны одной косой черте. Из Спецификация Single Unix (версия 4) , базовые определения §3.271 pathname : "Несколько последовательных слешей считаются одинаковыми как один слеш".

Есть одно исключение: если имя пути начинается с двух последовательных символов, первый компонент, следующий за начальными символами, может интерпретироваться в зависимости от реализации. (ссылка: базовые определения §4.13 разрешение пути ). Сам Linux не делает этого, хотя некоторые приложения могут, а другие системы Unix-ish (например, Cygwin).

Трейлинг / в конце имени пути заставляет имя пути ссылаться на каталог. В ( базовые определения POSIX 1003.1-2001 (Single Unix v4) §4.11 разрешение пути , завершающий / эквивалентно завершающему /.. базовые определения POSIX 1003.1-2008 (Single Unix v4) §4.1 устраняет требование сделать его эквивалентным /., чтобы справиться с несуществующими каталогами (например, mkdir foo/ требуется для работы, тогда как mkdir foo/. не будет - см. обоснование изменения).

Для программ, которые работают с записью каталога, если foo является символической ссылкой на каталог, то передача foo/ - это способ заставить программу действовать в каталоге вместо символической ссылки.

¹ Обратите внимание, что это применимо только к разрешению пути, то есть при доступе к файлам. Манипуляции с именами файлов могут работать по-разному. Например basename и dirname игнорировать завершающие косые черты.

173
Gilles 'SO- stop being evil'

Похоже, операционная система тоже не заботится об этом, только что попробовав программу на C с прямым системным вызовом, открывающуюся с // в пути.

Вы можете использовать python os.path.normpath, чтобы нормализовать ее, что избавляет вас от необходимости сканировать строку в поисках дополнительных функций. Другие языки имеют аналогичные функции.

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

17
Ivatar

На всех Unix-системах, которые я видел, он такой же, как одиночный /, но стандарт Unix указывает, что

Имя пути, начинающееся с двух последовательных слешей, может интерпретироваться способом, определяемым реализацией, хотя более двух ведущих слешей должны обрабатываться как один слеш.

так что это может быть обработано специально, в зависимости от вашей системы. (Некоторые старые версии Unix использовали двойное ведение / для удаленного доступа к файловой системе, и некоторые из них могут быть.)

9
Fred Foo

Используйте os.path.join in Python и вы не получите несколько слэшей. Создание имен файлов самостоятельно путем объединения строк считается плохим Python.

7
Neil Mayhew

Нет никакой разницы.

Несколько косых черт игнорируются (без эффекта), например:

ls -al //usr///////bin/sed
3
ChristopheD

Конечно, вы можете нормализовать путь с несколькими возможными/(косыми чертами), пропустив его через tr -s

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

... а затем используйте $NORMALIZED

Однако это должно быть необходимо. Насколько я знаю, любое ядро ​​UNIX должно игнорировать параллельные разделители пути - или концептуально обрабатывать их как ..././...

0
Jim Dennis