В чем разница между
cd abc/xyz/
а также
cd abc/xyz
Какова важность /
в конце? Как правильно его использовать? Потому что оба, кажется, работают правильно.
В чем разница между
cd abc/xyz/
а также
cd abc/xyz
Какова важность /
в конце? Как правильно его использовать? Потому что оба, кажется, работают правильно.
Разница может быть незначительной в приведенном вами примере cd
, но будьте осторожны, когда вы mv
файлы.
Например, если вы хотите переместить несколько файлов в другой каталог, и вы вводите
for i in *.mp3 ; do mv $i dest ; done
Забыв завершающий слеш, каждый из перемещенных файлов перезапишет файл с именем dest
(первый фактически создаст файл с именем dest
если он еще не существует). В результате все файлы, кроме последнего, перезаписываются последним файлом, и теперь он называется dest
.
Чтобы перейти в каталог, вы должны указать конечный /
for i in *.mp3 ; do mv $i dest/ ; done
Одним из побочных эффектов слеша является то, что если каталог не существует, вы получите сообщение об ошибке.
cd abc/xyz/
это правильный способ сделать это. Но если вы укажете
cd abc/xyz
и если cd узнает, что xyz является каталогом, он предполагает наличие завершающего /
cd abc/xyz
Это правильно, так как «abc /xyz» относится к «сущности" xyz "в каталоге" abc " ». Когда вы печатаете
cd abc/xyz/
он ссылается на «» сущность в каталоге "xyz" в каталоге "abc" . Сущность «» (пустая строка) автоматически переводится в «.», Который является "текущим" каталогом, который в данном случае является каталогом "xyz". Так что все получается к тому же.
(Некоторые люди считают, что каталоги « должны » иметь косую черту. Они ошибаются.)
Они одинаковые. Строка обрабатывается операторами имени файла как "путь", который является абстракцией, и каждый путь связан с базовым именем и другим путем, dirname. Два пути идентичны, если каждый из них является одной и той же строкой. Для вашего примера:
cas var$ dirname abc/xyz; basename abc/xyz abc xyz cas var$ dirname abc/xyz/; basename abc/xyz/ abc xyz
Обратите внимание, что, хотя некоторые программы обрабатывают строки одинаково, включая все обычные утилиты UNIX, если они имеют одинаковые пути, есть другие, которые заботятся о конечных слешах. Наиболее важным из них является rsync
.
Postscript Из спецификации POSIX, разрешение пути:
Имя пути, которое содержит как минимум один символ без косой черты и заканчивается одним или несколькими завершающими слешами, должно быть разрешено, как если бы к имени пути был добавлен один символ точки ('.').