Получить текущее имя каталога (без полного пути) в скрипте Bash
как бы я получил только текущее имя рабочего каталога в скрипте bash, или даже лучше, просто команду терминала.
pwd
дает полный путь текущего рабочего каталога, например /opt/local/bin
но я хочу только bin
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.
вы можете использовать комбинацию 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