Я работаю над сценарием Python, который передает расположение файлов в подпроцесс scp. Это все нормально, но я нахожусь в ситуации, когда я могу конкатенировать путь с именем файла, так что в пути есть двойное /
число. Я знаю, что bash не волнует, если у вас есть несколько разделителей файлов, но мне интересно, как именно это исправить. Это bash, который лишает лишних /
s или это вообще не имеет значения?
Я спрашиваю, потому что это сэкономит мне несколько строк кода для проверки дополнительных /
s при конкатенации. Я знаю, что это не имеет большого значения, но мне тоже любопытно. У меня есть сценарий bash, в котором есть строка cd //usr
(вместо cd /usr
), что, по-видимому, подразумевает, что может иметь значение использование нескольких /
s в пути
join
иabspath
и такие команды.Ответы:
Допускается несколько косых черт, и они эквивалентны одной косой черте. Из спецификации Single Unix (версия 3) , базовые определения §3.266 pathname : «Несколько последовательных слешей считаются одинаковыми как один слеш».
Есть одно исключение: если имя пути начинается ровно с двух слэшей, оно может обрабатываться по-разному (см .: базовые определения §4.11 разрешение пути ). Сам Linux не делает этого, хотя некоторые приложения могут, а другие системы Unix-ish (например, Cygwin).
Завершающий
/
конец в конце имени пути заставляет имя пути ссылаться на каталог. В ( POSIX 1003.1-2001 определения (Single v3 Unix) базовых разрешениях имен путей §4.11 , замыкающий/
эквивалентен завершающий/.
. POSIX 1003.1-2008 (Single Unix v4) базовые определения §4.12 отменяет требование , чтобы сделать его эквивалент/.
, для того , справиться с несуществующими каталогами (напримерmkdir foo/
, должен работать, аmkdir foo/.
не будет - см. обоснование изменения).Для программ, которые действуют на элемент каталога, если
foo
это символическая ссылка на каталог, передачаfoo/
является способом заставить программу действовать на каталог вместо символической ссылки.¹ Обратите внимание, что это относится только к разрешению имени пути, то есть при доступе к файлам. Манипуляции с именами файлов могут работать по-разному. Например
basename
иdirname
игнорировать косые черты.источник
/.
был удален после более позднего процесса обсуждения, поскольку он был неоднозначным. Во всяком случае, +1, так как найти такую информацию хорошо обобщено сложно.ОС, похоже, тоже не заботится об этом, только что попробовав программу на C с прямым системным вызовом, чтобы открыть с // в пути.
Вы можете использовать библиотечную функцию python os.path.normpath, чтобы нормализовать ее, что избавляет вас от необходимости просматривать строку в поисках дополнений. Другие языки имеют аналогичные функции.
http://docs.python.org/library/os.path.html#os.path.normpath
источник
На всех Unix-системах, которые я видел, он такой же, как один
/
, но стандарт Unix указывает, чтотак что это может быть обработано специально, в зависимости от вашей системы. (В некоторых старых версиях Unix
/
для удаленного доступа к файловой системе использовалось двойное ведение, но могут быть и другие.)источник
//remote/...
на удаленный доступ к файловой системе, вероятно, для согласованности с Windows\\remote\...
.//remote/...
то же самое, что и\\remote\...
формат пути UNC .//
особым образом, поскольку они могут проверятьfalse
абсолютность в соответствии со спецификацией Unix / POSIX.Используйте
os.path.join
в Python, и вы не получите несколько слешей. Создание имен файлов путем объединения строк считается плохим стилем Python.источник
/
очень хорошо.Нет никакой разницы.
Несколько косых черт игнорируются (без эффекта), например:
источник
Конечно, вы можете нормализовать путь с возможными множественными / (косыми чертами), пропустив его через
tr -s
... а затем использовать
$NORMALIZED
Однако это должно быть необходимо. Насколько я знаю, любое ядро UNIX должно игнорировать параллельные разделители пути - или концептуально трактовать их как ...
/./
...источник