Сегодня при написании сценария моей оболочки.
Внезапно у меня возникает вопрос.
С тех пор cd /target_dir
и то и cd /target_dir/
другое работает.
Должен ли я добавить косую черту в конце моих переменных пути в сценарии оболочки?
Такие как LOG_PATH=/data/nginx/logs
против LOG_PATH=/data/nginx/logs/
.
Я провел грубый поиск в Google, но не нашел обсуждения по этому поводу, может быть, это слишком просто?
На данный момент мне очень трудно решить, какой стиль выбрать.
Но я предпочел LOG_PATH=/target_dir/
стиль немного больше.
Потому что, когда я делаю автозаполнение с помощью bash, результат выводится с помощью косой черты.
Что вы думаете об этом, почему?
Ответы:
Согласно POSIX:
источник
//
и/
их имена, иpwd
я получу другой путь, но их содержимое будет идентичным! Почему?bash
отслеживает текущий каталог очень наивно, как строку. Он просто добавляет и удаляет из пути эвристически, он не связан с реальной файловой системой. Одним из последствий этого является то, что вы можете перейти в символическую ссылку и вернуться тем же путем (если bash не решил, что это было слишком много, и повторно инициализировал его). Другой - это то, что вы описываете. Вы не должны полагаться на отслеживание оболочки текущего каталога, это ненадежно.Чтобы быть на безопасной стороне, включите косую черту. Это может привести к множественным наклонам при объединении путей, но, по крайней мере, вы избежите проблем.
Несколько примеров:
rsync
трактует пути по-разному, если включен конечный слеш (он синхронизирует этот каталог вместо создания другого подкаталога). Символические ссылки на каталоги иногда ведут себя неожиданным образом, когда у них нет завершающего слеша - по крайней мере, завершение оболочки запутывается. Вы никогда не знаете, зависит ли вызываемая вами команда / скрипт от проверки на наличие косой черты для какого-то особого поведения. Это может даже спасти вас от перезаписи. Например, если у вас есть файл с именемfoo
, но вы по ошибке думаете, что это каталог и хотите что-то в нем переместить, онmv bar foo
перезапишет файл (потеря данных, потенциальная катастрофа), ноmv bar foo/
просто будет жаловаться и ничего не делать.Итак, в заключение следует сказать, что в большинстве случаев это не имеет значения, но вы должны использовать косую черту, чтобы защитить себя, а также, чтобы сделать для читателя более очевидным, что вы намеревались сделать в сценарии. Случайный наблюдатель сразу же будет уверен, что переменная ссылается на каталог, если он заканчивается косой чертой, и будет использовать его правильно, если его нужно изменить.
источник
Нет, не стоит. Это добавляет дополнительную ненужную косую черту (
/
).пример
скажем, вы хотите экспортировать
bin
каталог Java в вашуPATH
переменную,export PATH=$PATH:/opt/jre1.7.0_45/bin/
теперь проверь это,
обратите внимание на дополнительную косую черту (
/
) перед Java, но, к счастью, в таком случае это работает.источник