Я хочу попросить пользователя моего скрипта bash передать путь к каталогу в качестве аргумента. Что из следующего является хорошей практикой программирования?
- Требовать, чтобы пользователь вводил трейлинг / (косая черта)
- Требовать, чтобы пользователь не вводил трейлинг / (косая черта)
programming-practices
user-interface
bash
Рохит Агарвал
источник
источник
rsync
поведение по-разному очень важно, в зависимости от наличия трейлинга/
, и поэтому в некоторых случаях вы хотите нормализовать для согласованности, а в других вы бы хотели пройти чисто, чтобы реализовать то, что сказал пользователь (если они знал, что они разговаривалиrsync
).ls -l dir
ведет себя иначе, чемls -l dir/
еслиdir
это символическая ссылка на каталог.Ответы:
Лучшая практика - не предполагать ни того, ни другого
Если у вас есть доступ к утилитам / классам компоновщика пути, используйте их, если нет, напишите свой код, чтобы принять любой формат и действовать соответственно.
Нет ничего более раздражающего для пользователя, чем необходимость помнить, добавлять ли косую черту или нет.
источник
dirname
,basename
иreadlink
. Очень распространенной проблемой является использование${path##*/}
в качестве заменыbasename
, но если путь заканчивается косой чертой, которая возвращает пустую строку вместо последнего элемента пути.rsync
я смотрю на вас)${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))
я также задокументировал это для ясности: добавьте или удалите косую черту в bashПоскольку bash игнорирует несколько косых черт, вы можете смело предположить, что пользователь не вводил косую черту в пути и не добавлял косую черту самостоятельно.
так же, как
Итак, ваш скрипт может выглядеть так:
и вам не нужно беспокоиться, введет ли пользователь трейлинг / в путь.
источник
bash
поведение, это делает ядро.У покойного Джона Постела в разделе 3.2 RFC 760 был несколько полезных советов :
источник
Концептуально слеш не является частью имени. Косая черта - это только разделитель между именами. Мой домашний каталог / home / stefan, а не / home / stefan /.
Если вы не ожидаете косой черты, вы не ошибетесь, если она есть, как уже отмечал ammoQ. Но вы можете легко склеить имена и переменные, потому что вам не нужно указывать косую черту:
источник
Требование, чтобы каталог не имел завершающей косой черты, было бы чрезвычайно раздражающим для интерактивного использования на консоли: автозаполнение с TAB автоматически добавляет завершающую косую черту для каталогов.
Поэтому вам, безусловно, нужно разрешить указывать каталоги с косой чертой.
источник