在Bash脚本中获取当前目录名称(没有完整path)

我怎样才能得到一个bash脚本中的当前工作目录名称,甚至更好,只是一个terminal命令。

pwd给出了当前工作目录的完整path,例如/opt/local/bin但是我只想要bin

不需要basename,特别是不需要运行pwd的子shell(它增加了额外的和昂贵的fork操作 )。 shell可以使用参数扩展在内部执行此操作:

 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 
 $ echo "${PWD##*/}" 

您可以使用pwd和basename的组合。 例如

 #!/bin/bash CURRENT=`pwd` BASENAME=`basename "$CURRENT"` echo "$BASENAME" exit; 

grep怎么样:

 pwd | grep -o '[^/]*$' 

我喜欢所选的答案(查尔斯·达菲),但要小心,如果你在一个符号链接目录,你想要的目标目录的名称。 不幸的是,我不认为这可以在一个参数扩展expression式中完成,也许我错了。 这应该工作:

 target_PWD=$(readlink -f .) echo ${target_PWD##*/} 

要看到这个,一个实验:

 cd foo ln -s . bar echo ${PWD##*/} 

报“吧”

DIRNAME

要显示path的主目录(不会产生/ usr / bin / dirname的fork-exec):

 echo ${target_PWD%/*} 

这将例如变换foo / bar / baz – > foo / bar

 echo "$PWD" | sed 's!.*/!!' 

如果您使用的是Bourne shell或者${PWD##*/}不可用。

这个线程太棒了! 这是一个更多的味道:

 pwd | awk -F / '{print $NF}' 

令人惊讶的是,没有人提到这个select只使用内置的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或更新版本上工作。

 basename $(pwd) 

要么

 echo "$(basename $(pwd))" 

我通常在sh脚本中使用这个

 SCRIPTSRC=`readlink -f "$0" || echo "$0"` RUN_PATH=`dirname "${SCRIPTSRC}" || echo .` echo "Running from ${RUN_PATH}" ... cd ${RUN_PATH}/subfolder 

你可以使用它来自动化的东西…

下面的grep用正则expression式也在工作,

 >pwd | grep -o "\w*-*$" 

很简单

 pwd | xargs basename 

find像我这样的骑师

 find $PWD -maxdepth 0 -printf "%f\n" 

我非常喜欢使用gbasename ,它是GNU coreutils的一部分。

以下命令将导致在bash脚本中打印当前的工作目录。

 pushd . CURRENT_DIR="`cd $1; pwd`" popd echo $CURRENT_DIR 

您可以使用basename实用工具从string中删除以/结尾的任何前缀(如果存在于string中),并将结果打印在标准输出中。

 $basename <path-of-directory> 

只要使用:

 pwd | xargs basename 

要么

 basename "`pwd`" 

我使用这个命令:

dirname "$0"