Разница между включением / в конец пути к каталогу и его пропуском

Разница между включением / в конец пути к каталогу и его пропуском

Мне просто интересно, есть ли разница в том, что происходит, когда я оставляю / в конце пути к файлу, например:

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/: Такого файла или каталога нет

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

Связанный контент