Также есть:
mkdir '
'; dir=$(basename ./'
'); echo "${#dir}"
0
Такие странные вещи случаются, потому что есть много интерпретации и синтаксического анализа, а остальное должно происходить, когда два процесса взаимодействуют. Подстановки команд удаляют завершающие символы новой строки. И NUL (хотя, очевидно, здесь это не имеет значения) . basename
и dirname
также удаляют завершающие символы новой строки в любом случае, потому что как еще вы с ними разговариваете? Я знаю, что завершающие символы новой строки в имени файла в любом случае являются анафемой, но вы никогда не узнаете. И нет смысла идти по пути, который может быть ошибочным, если можно было поступить иначе.
Тем не менее ... $ {pathname ## * /}! = Basename
и аналогично $ {pathname% / *}! = Dirname
. Эти команды предназначены для выполнения в основном четко определенной последовательности шагов для достижения указанных результатов.
Спецификация приведена ниже, но сначала краткая версия:
basename()
case $1 in
(*[!/]*/) basename "${1%"${1##*[!/]}"}" ${2+"$2"} ;;
(*/[!/]*) basename "${1##*/}" ${2+"$2"} ;;
(${2:+?*}"$2") printf %s%b\\n "${1%"$2"}" "${1:+\n\c}." ;;
(*) printf %s%c\\n "${1##///*}" "${1#${1#///}}" ;;
esac
Это полностью POSIX-совместимое базовое имя
в простом sh
. Сделать это несложно. Я объединил пару веток, которые использую ниже, потому что это не повлияло на результаты.
Вот спецификация:
basename()
case $1 in
("") # 1. If string is a null string, it is
# unspecified whether the resulting string
# is '.' or a null string. In either case,
# skip steps 2 through 6.
echo .
;; # I feel like I should flip a coin or something.
(//) # 2. If string is "//", it is implementation-
# defined whether steps 3 to 6 are skipped or
# or processed.
# Great. What should I do then?
echo //
;; # I guess it's *my* implementation after all.
(*[!/]*/) # 3. If string consists entirely of <slash>
# characters, string shall be set to a sin‐
# gle <slash> character. In this case, skip
# steps 4 to 6.
# 4. If there are any trailing <slash> characters
# in string, they shall be removed.
basename "${1%"${1##*[!/]}"}" ${2+"$2"}
;; # Fair enough, I guess.
(*/) echo /
;; # For step three.
(*/*) # 5. If there are any <slash> characters remaining
# in string, the prefix of string up to and
# including the last <slash> character in
# string shall be removed.
basename "${1##*/}" ${2+"$2"}
;; # == ${pathname##*/}
("$2"|\
"${1%"$2"}") # 6. If the suffix operand is present, is not
# identical to the characters remaining
# in string, and is identical to a suffix of
# the characters remaining in string, the
# the suffix suffix shall be removed from
# string. Otherwise, string is not modi‐
# fied by this step. It shall not be
# considered an error if suffix is not
# found in string.
printf %s\\n "$1"
;; # So far so good for parameter substitution.
(*) printf %s\\n "${1%"$2"}"
esac # I probably won't do dirname.
... может быть, комментарии отвлекают ....
Выполняет ли приложение какое-либо анонимное выделение памяти через mmap ()?
Какие-либо файлы данных или журналов записываются на RAM-диск? Есть темы, которые постоянно начинаются и заканчиваются? Правильно обрабатывать завершение потока? (Был там, нашел, что как утечка. )Если вы немного подождете, уменьшится ли использование памяти ядром по мере освобождения динамических структур?
Я бы оценил вероятность утечки памяти выше 99% в пользу приложения.