Как получить только текущее имя рабочего каталога в bash script, или даже лучше, просто команду терминала.
pwd
дает полный путь к текущему рабочему каталогу, например. /opt/local/bin
, но я хочу только bin
Как получить только текущее имя рабочего каталога в bash script, или даже лучше, просто команду терминала.
pwd
дает полный путь к текущему рабочему каталогу, например. /opt/local/bin
, но я хочу только bin
Нет необходимости в базовом имени, и особенно нет необходимости в подоболочке, выполняющей pwd (которая добавляет дополнительную и дорогостоящую операцию fork); оболочка может сделать это внутренне, используя расширение параметра:
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
, а в какой-то другой переменной, содержащей имя каталога), вам может потребоваться обрезать любые завершающие слэши. Ниже используется поддержка ba extglob для работы даже с несколькими конечными слешами:
dirname=/path/to/somewhere//
shopt -s extglob # enable +(...) glob syntax
result=${dirname%%+(/)} # trim however many trailing slashes exist
result=${result##*/} # remove everything before the last / that still remains
printf '%s\n' "$result"
В качестве альтернативы, без extglob
:
dirname="/path/to/somewhere//"
result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim
result="${result##*/}" # remove everything before the last /
Используйте программу basename
. Для вашего случая:
% basename "$PWD"
bin
$ echo "${PWD##*/}"
Вы можете использовать комбинацию pwd и basename. Например.
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
Как насчет grep:
pwd | grep -o '[^/]*$'
Мне нравится выбранный ответ (Charles Duffy), но будьте осторожны, если вы находитесь в символическом каталоге, и вам нужно имя целевого каталога. К сожалению, я не думаю, что это можно сделать в одном выражении расширения параметра, возможно, я ошибаюсь. Это должно работать:
target_PWD=$(readlink -f .)
echo ${target_PWD##*/}
Чтобы увидеть это, эксперимент:
cd foo
ln -s . bar
echo ${PWD##*/}
сообщает "bar"
Чтобы показать ведущие каталоги пути (без возникновения fork-exec из /usr/bin/dirname ):
echo ${target_PWD%/*}
Это будет, например, transform foo/bar/baz → foo/bar
echo "$PWD" | sed 's!.*/!!'
Если вы используете оболочку Bourne или ${PWD##*/}
недоступно.
Эта тема замечательная! Вот еще один вкус:
pwd | awk -F / '{print $NF}'
basename $(pwd)
или
echo "$(basename $(pwd))"
Удивительно, но никто не упомянул об этой альтернативе, которая использует только встроенные команды 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 "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
echo "Running from ${RUN_PATH}"
...
cd ${RUN_PATH}/subfolder
вы можете использовать это для автоматизации...
Чтобы найти там жокеев вроде меня:
find $PWD -maxdepth 0 -printf "%f\n"
Ниже grep с регулярным выражением также работает,
>pwd | grep -o "\w*-*$"
очень просто
pwd | xargs basename
basename "$PWD"
ИЛИ
IFS=/
var=($PWD)
echo ${var[-1]}
Переведите внутренний разделитель имен файлов (IFS) обратно на пробел.
IFS=
После IFS = один пробел.
Вы можете использовать служебную программу basename, которая удаляет любой префикс, заканчивающийся в/и суффикс (если присутствует в строке) из строки, и печатает результат на стандартном выходе.
$basename <path-of-directory>
Просто используйте:
pwd | xargs basename
или
basename "`pwd`"
Я предпочитаю использовать gbasename
, который является частью GNU coreutils.
Если вы хотите видеть только текущий каталог в области приглашения bash, вы можете отредактировать файл .bashrc
в ~
. Измените \w
на \W
в строке:
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
Запустите source ~/.bashrc
, и он отобразит только имя каталога в области приглашения.
Ref: https://superuser.com/questions/60555/show-only-current-directory-name-not-full-path-on-bash-prompt
Следующие команды приведут к печати текущего рабочего каталога в bash script.
pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR
Я использую эту команду:
dirname "$0"