Когда будет использоваться несколько `///` между подкаталогами?
Я копался /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
игнорировать косые черты.
В этом случае я предполагаю ///
просто программирует чрезмерную осторожность (некоторые разработчики используют /
присоединяться к путям, когда у них уже есть конечные или ведущие косые черты соответственно).