Когда будет использоваться несколько `///` между подкаталогами?

Я копался /var/log/plymouth-debug.log и заметил эту строку:

[main.c:716] get_cache_file_for_mode:returning cache file '/var/lib/plymouth//boot-duration'

Я подумал, что это опечатка, поэтому набрал следующее и, конечно же, вы можете иметь как можно больше /// между подкаталогами и именем файла, как вы хотите. Например:

rick@dell:~$ ls -la /var/lib/plymouth/boot-duration
-rw-r--r-- 1 root root 2041 Nov  3 21:39 /var/lib/plymouth/boot-duration
────────────────────────────────────────────────────────────────
rick@dell:~$ ls -la /var/lib/plymouth/////boot-duration
-rw-r--r-- 1 root root 2041 Nov  3 21:39 /var/lib/plymouth/////boot-duration
────────────────────────────────────────────────────────────────
rick@dell:~$ ls -la /var/lib//plymouth///boot-duration
-rw-r--r-- 1 root root 2041 Nov  3 21:39 /var/lib//plymouth///boot-duration

При каких обстоятельствах вы хотели бы использовать два или более // вместо одного / разделитель?

1 ответ

Решение

На это очень хорошо ответил Gilles из Unix & Linux: как Linux обрабатывает несколько последовательных разделителей пути (/home////username///file)?

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

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

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

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

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

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

Другие вопросы по тегам