如何在bash脚本中获取当前工作目录名称,甚至更好,只需一个终端命令。
pwd
给出了当前工作目录的完整路径,例如/opt/local/bin
但我只想要bin
答案 0 :(得分:966)
不需要basename,特别是不需要运行pwd的子shell(adds an extra, and expensive, fork operation); shell可以使用parameter expansion内部执行此操作:
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
,而是包含目录名称的其他变量),则可能需要修剪任何尾部斜杠。下面使用bash的extglob support来处理多个尾部斜杠:
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 /
答案 1 :(得分:248)
使用basename
程序。对于你的情况:
% basename "$PWD"
bin
答案 2 :(得分:127)
$ echo "${PWD##*/}"
答案 3 :(得分:23)
您可以使用pwd和basename的组合。 E.g。
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
答案 4 :(得分:15)
grep如何:
pwd | grep -o '[^/]*$'
答案 5 :(得分:8)
我喜欢选定的答案(Charles Duffy),但如果你在符号链接的目录中并且想要目标目录的名称,请小心。不幸的是我不认为它可以在单个参数扩展表达式中完成,也许我错了。这应该有效:
target_PWD=$(readlink -f .)
echo ${target_PWD##*/}
要看到这个,一个实验:
cd foo
ln -s . bar
echo ${PWD##*/}
报告“bar”
显示路径的前导目录(不会产生/ usr / bin / dirname的fork-exec):
echo ${target_PWD%/*}
这将是例如变换foo / bar / baz - >富/酒吧
答案 6 :(得分:7)
echo "$PWD" | sed 's!.*/!!'
如果您使用的是Bourne shell,则${PWD##*/}
不可用。
答案 7 :(得分:5)
这个帖子很棒!这是另一种味道:
pwd | awk -F / '{print $NF}'
答案 8 :(得分:4)
basename $(pwd)
或
echo "$(basename $(pwd))"
答案 9 :(得分:4)
令人惊讶的是,没有人提到仅使用内置bash命令的替代方案:
event["tag"] = ["_filter_error"]
作为额外奖励,您可以轻松获取父目录的名称:
i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"
这些将适用于Bash 4.3-alpha或更新版本。
答案 10 :(得分:3)
我通常在sh脚本中使用它
SCRIPTSRC=`readlink -f "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
echo "Running from ${RUN_PATH}"
...
cd ${RUN_PATH}/subfolder
你可以用它来自动化......
答案 11 :(得分:2)
对于像我这样的发现骑师:
find $PWD -maxdepth 0 -printf "%f\n"
答案 12 :(得分:1)
basename "$PWD"
或强>
IFS=/
var=($PWD)
echo ${var[-1]}
将内部文件名称分隔符(IFS)转回空格。
IFS=
IFS =后有一个空格。
答案 13 :(得分:1)
如果只想在bash提示区域中看到当前目录,则可以在.bashrc
中编辑~
文件。将以下行中的\w
更改为\W
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
运行source ~/.bashrc
,它将仅在提示区域中显示目录名称。
参考:https://superuser.com/questions/60555/show-only-current-directory-name-not-full-path-on-bash-prompt
答案 14 :(得分:1)
使用正则表达式的grep下面也正常,
>pwd | grep -o "\w*-*$"
答案 15 :(得分:0)
我特别喜欢Charles的方法,因为它避免了一个新的过程,有很多方法,但是在不知道这一点之前,我用awk解决了它
pwd | awk -F/ '{print $NF}'
答案 16 :(得分:0)
只需删除任何字符直到 /
(或 \
,如果您使用的是 Windows)。由于匹配将变得贪婪,它将删除所有内容,直到最后一个 /
:
pwd | sed 's/.*\///g'
在您的情况下,结果符合预期:
λ a='/opt/local/bin'
λ echo $a | sed 's/.*\///g'
bin
答案 17 :(得分:0)
我非常喜欢使用gbasename
,这是GNU coreutils的一部分。
答案 18 :(得分:0)
只需使用:
pwd | xargs basename
或
basename "`pwd`"
答案 19 :(得分:0)
您可以使用basename实用程序从字符串中删除以/结尾的任何前缀(如果存在于字符串中),并打印 结果是标准输出。
$basename <path-of-directory>
答案 20 :(得分:-1)
以下命令将导致以bash脚本打印当前工作目录。
pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR
答案 21 :(得分:-6)
我使用这个命令:
dirname "$0"