Как получить только текущее имя рабочего каталога в bash script, или даже лучше, просто команду терминала.
pwd
дает полный путь к текущему рабочему каталогу, например. /opt/local/bin
, но я хочу только bin
Нет необходимости в basename, и, особенно, нет необходимости в 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
. Для вашего случая:
% basename "$PWD"
bin
basename
? Что не так с этим ответом, кроме пропущенных кавычек?
basename
- это действительно внешняя программа, которая делает правильные вещи, но запускать любую внешнюю программу для чего-то, что bash может делать из коробки, используя только встроенную функциональность, глупо, что сказывается на производительности ( fork()
, execve()
, wait()
и т. д.) без причины.
$ echo "${PWD##*/}"
echo
, Чарли;)
echo "${PWD##*/}"
.
Вы можете использовать комбинацию pwd и basename. Например.
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
Как насчет grep:
pwd | grep -o '[^/]*$'
pwd | xargs basename
не ... вероятно, не так важно, но другой ответ проще и более согласован в разных средах
Мне нравится выбранный ответ (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
readlink -f
является расширением GNU и поэтому недоступна на BSD (включая OS X).
echo "$PWD" | sed 's!.*/!!'
Если вы используете оболочку Bourne или ${PWD##*/}
недоступно.
${PWD##*/}
- это POSIX sh - каждый современный / bin / sh (включая тире, пепел и т. Д.) Поддерживает это; чтобы поразить настоящую Борн на недавнем боксе, вам нужно будет использовать слегка устаревшую систему Solaris. Помимо этого - echo "$PWD"
; пропуск кавычек приводит к ошибкам (если в имени каталога есть пробелы, символы подстановки и т. д.).
Эта тема замечательная! Вот еще один вкус:
pwd | awk -F / '{print $NF}'
Удивительно, но никто не упомянул об этой альтернативе, которая использует только встроенные команды 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 или новее.
очень просто
pwd | xargs basename
Ниже grep с регулярным выражением также работает,
>pwd | grep -o "\w*-*$"
Я обычно использую это в сценариях sh
SCRIPTSRC=`readlink -f "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
echo "Running from ${RUN_PATH}"
...
cd ${RUN_PATH}/subfolder
вы можете использовать это для автоматизации...
readlink: illegal option -- f usage: readlink [-n] [file ...]
basename $(pwd)
или
echo "$(basename $(pwd))"
pwd
разбивается на строки и расширяется до basename
перед передачей в basename
.
Я предпочитаю использовать gbasename
, который является частью GNU coreutils.
Чтобы найти там жокеев вроде меня:
find $PWD -maxdepth 0 -printf "%f\n"
Следующие команды приведут к печати текущего рабочего каталога в bash script.
pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR
$1
будет содержать текущий рабочий каталог. (2) pushd
и popd
не служат никакой цели здесь , потому что что - то внутри обратных кавычек делается в субоболочке - поэтому он не может повлиять на каталог родительской оболочки, чтобы начать с. (3) Использование "$(cd "$1"; pwd)"
будет более читабельным и устойчивым к именам каталогов с пробелами.
Я использую эту команду:
dirname "$0"
/bin
?????
Просто используйте:
pwd | xargs basename
или
basename "`pwd`"
xargs
xargs неэффективна и содержит ошибки, когда имена каталогов содержат буквальные символы новой строки или символы кавычек, а вторая формулировка вызывает Команда pwd
в подоболочке, вместо того, чтобы получить тот же результат через расширение встроенной переменной.
Вы можете использовать служебную программу basename, которая удаляет любой префикс, заканчивающийся в/и суффикс (если присутствует в строке) из строки, и печатает результат на стандартном выходе.
$basename <path-of-directory>