
Мне просто интересно, есть ли разница в том, что происходит, когда я оставляю / в конце пути к файлу, например:
root /var/www/website.com/
И опуская это, как:
root /var/www/website.com
Как это решается и есть ли разница?
решение1
Конечный слеш после имени каталога имеет значение в некоторых программах и не имеет значения в других. Например:
В git
/
после filename подразумевается только каталог, а не отдельный файл (изman 5 gitignore
):Если шаблон заканчивается косой чертой, он удаляется для целей следующего описания, но он найдет только совпадение с каталогом. Другими словами, foo/ будет соответствовать каталогу foo и путям под ним, но не будет соответствовать обычному файлу или символической ссылке foo (это соответствует тому, как pathspec работает в целом в git).
ls
В отвикипедия):При запросе листинга каталога символической ссылки, указывающей на каталог
, будет отображена только сама ссылка. Чтобы
получить листинг связанного каталога, путь должен
включать завершающий символ-разделитель каталогов ('/', слэш).Однако некоторые другие программы, которые я сейчас не могу вспомнить (в основном макросы Emacs, которые я видел), которые ожидают только каталог, а не обычный файл, будут принимать и то, и другое,
dir
иdir/
будут добавлять/
при необходимости, например, для ссылки на файл внутриdir
.
Я не знаю, как работает nginx, но посмотритеответ муру.
решение2
В общем случае, путь без завершающего слеша неоднозначен: он может быть как файлом, так и каталогом. Путь с завершающим слешем может быть только каталогом. Большинство оболочек автоматически добавляют завершающий слеш при использовании автодополнения клавишей Tab.
Это не значит, что вы всегда должны использовать завершающий слеш; на самом деле некоторые программы не допускают его использование. Как и утверждали другие, это зависит от контекста. Каждая программа интерпретирует это по-разному.
Одним из примеров, где завершающий слеш имеет огромное значение, является rsync
.
Учитывая каталоги source
и target
, команда rsync -a source target
скопирует все в target/source
. Но с косой чертой в конце rsync -a source/ target
копирует содержимое source
в target
напрямую, без создания target/source
подкаталога.
Меня часто сбивает с толку такое поведение, поэтому вместо того, чтобы полагаться на неявное создание подкаталога, я предпочитаю записывать его. Иногда я даже использую завершающий, /.
чтобы убедиться, что не будут созданы нежелательные подкаталоги, поскольку подкаталог .
уже есть.
решение3
Контекст действительно имеет значение. Для nginx
, при указании root
для местоположения, это не имеет никакого значения, так как nginx
знает, что это каталог. Однако это может иметь значение в другом месте, так какДвойные косые черты могут вызывать проблемы в URL-адресах(то есть, если вы делаете что-то blah/$request_uri
вроде перезаписи или проксирования).
В общем, это не имеет значения, когда речь идет о платформах *nix. Есть несколько исключений:
rsync
ведет себя по-разному в зависимости от того, имеет ли путь к исходному каталогу завершающий слеш или нет.Хороший пример того, как rsync обрабатывает завершающие слеши.Добавление завершающего слеша может дать приложению знать, что оно ищет каталог, вместо того, чтобы случайно создать файл:
cp blah non-existent-directory cp blah non-existent-directory2/
Подобно вышесказанному, при глобализации его можно использовать для принудительного расширения только в каталоги:
$ printf "%s\n" * | wc -l 26 $ printf "%s\n" */ | wc -l 20
Извините за пример. Это сделано в корне довольно стандартной установки Ubuntu, так что ни одно странное имя не пострадало во время выполнения этого примера.
решение4
Если вы введете в оболочке:
cd путь/somedir
Это перемещает ваш текущий каталог впуть/somedir.
Но если вы введете:
cd путь/somedir/
Он печатает:
bash: cd: path/somedir/: Такого файла или каталога нет
Возможно, потому, что этот /
символ означает, что путь не полный, а продолжается, поэтому если вы ничего не поставите после него, это будет то же самое, что ссылка на несуществующий файл.