4

В чем разница между

cd abc/xyz/

а также

cd abc/xyz

Какова важность / в конце? Как правильно его использовать? Потому что оба, кажется, работают правильно.

4 ответа4

9

Разница может быть незначительной в приведенном вами примере cd , но будьте осторожны, когда вы mv файлы.

Например, если вы хотите переместить несколько файлов в другой каталог, и вы вводите

for i in *.mp3 ; do mv $i dest ;  done

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

Чтобы перейти в каталог, вы должны указать конечный /

for i in *.mp3 ; do mv $i dest/ ;  done

Одним из побочных эффектов слеша является то, что если каталог не существует, вы получите сообщение об ошибке.

2
cd abc/xyz/

это правильный способ сделать это. Но если вы укажете

cd abc/xyz

и если cd узнает, что xyz является каталогом, он предполагает наличие завершающего /

2
cd abc/xyz

Это правильно, так как «abc /xyz» относится к «сущности" xyz "в каталоге" abc " ». Когда вы печатаете

cd abc/xyz/

он ссылается на «» сущность в каталоге "xyz" в каталоге "abc" . Сущность «» (пустая строка) автоматически переводится в «.», Который является "текущим" каталогом, который в данном случае является каталогом "xyz". Так что все получается к тому же.

(Некоторые люди считают, что каталоги « должны » иметь косую черту. Они ошибаются.)

1

Они одинаковые. Строка обрабатывается операторами имени файла как "путь", который является абстракцией, и каждый путь связан с базовым именем и другим путем, 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, разрешение пути:

Имя пути, которое содержит как минимум один символ без косой черты и заканчивается одним или несколькими завершающими слешами, должно быть разрешено, как если бы к имени пути был добавлен один символ точки ('.').

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .