20 ответов:
нет необходимости в базовом имени, и особенно нет необходимости в подрешетке под управлением pwd (который добавляет дополнительную и дорогостоящую операцию вилки); оболочка может сделать это внутренне, используя расширения параметр:
result=${PWD##*/} # to assign to a variable printf '%s\n' "${PWD##*/}" # to print to stdout # ...more robust than echo for unusual names # (consider a directory named -e or -n) printf '%q\n' "${PWD##*/}" # to print to stdout, quoted for use as shell input # ...useful to make hidden characters readable.
использовать
basename
вы можете использовать комбинацию pwd и basename. Е. Г.
#!/bin/bash CURRENT=`pwd` BASENAME=`basename "$CURRENT"` echo "$BASENAME" exit;
мне нравится выбранный ответ (Чарльз Даффи), но будьте осторожны, если вы находитесь в символическом каталоге, и вам нужно имя целевого каталога. К сожалению, я не думаю, что это можно сделать в одном выражении расширения параметра, возможно, я ошибаюсь. Это должно работать:
target_PWD=$(readlink -f .) echo ${target_PWD##*/}чтобы увидеть это, эксперимент:
cd foo ln -s . bar echo ${PWD##*/}отчеты "бар"
DIRNAME
показать ведущие каталоги пути (не беря на себя форк-exec /usr / bin / dirname):
echo ${target_PWD%/*}Это будет, например, преобразование из Foo/бар/баз -> файл foo/бар
Удивительно, но никто не упомянул эту альтернативу, которая использует только встроенные команды bash:
i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"Как бонус вы можете легко получить имя родительского каталога с:
[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"Они будут работать на Bash 4.3-alpha или новее.
Я обычно использую это в SH скрипты
SCRIPTSRC=`readlink -f "" || echo ""` RUN_PATH=`dirname "${SCRIPTSRC}" || echo .` echo "Running from ${RUN_PATH}" ... cd ${RUN_PATH}/subfolderвы можете использовать это, чтобы автоматизировать вещи ...
basename "$PWD"или
IFS=/ var=($PWD) echo ${var[-1]}Поверните внутренний разделитель имен файлов (IFS) обратно в пробел .
IFS=есть один пробел после IFS= .
вы можете использовать утилиту basename, которая удаляет любой префикс, заканчивающийся на / и суффикс (если он присутствует в строке) из строки, и печатает результат на стандартный вывод.
$basename <path-of-directory>
Я сильно предпочитаю использовать
gbasename, который является частью GNU coreutils.
следующие команды приведут к печати текущего рабочего каталога в сценарии bash.
pushd . CURRENT_DIR="`cd ; pwd`" popd echo $CURRENT_DIR
Comments