我将如何在bash脚本得到的只是当前工作目录名称,甚至更好,只是一个终端命令。
pwd
给出当前工作目录,例如完整路径/opt/local/bin
,但我只是想bin
我将如何在bash脚本得到的只是当前工作目录名称,甚至更好,只是一个终端命令。
pwd
给出当前工作目录,例如完整路径/opt/local/bin
,但我只是想bin
无需基本名称,尤其是不需要一个子shell运行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
,但其他一些变量保存目录名),你可能需要修剪任何尾随斜线。 下面的使用bash的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和基名的组合。 例如
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
如何grep的:
pwd | grep -o '[^/]*$'
我喜欢选择的答案(查尔斯·达菲),但如果你是在一个符号链接目录和你想要的目标目录的名称要小心。 不幸的是,我不认为它可以在一个单一的参数扩展表达来完成,也许是我错了。 这应该工作:
target_PWD=$(readlink -f .)
echo ${target_PWD##*/}
看到这一点,一个实验:
cd foo
ln -s . bar
echo ${PWD##*/}
报告“栏”
要显示的路径的主要目录(不产生在/ usr / bin中/目录名的叉EXEC):
echo ${target_PWD%/*}
这将如变换富/酒吧/巴兹 - >富/酒吧
echo "$PWD" | sed 's!.*/!!'
如果您使用的是Bourne shell或${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]}"
这些将在猛砸4.3-α或新工作。
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
你可以使用这个自动化的东西...
对于发现骑师那里和我一样:
find $PWD -maxdepth 0 -printf "%f\n"
下面的正则表达式的grep也在努力,
>pwd | grep -o "\w*-*$"
basename "$PWD"
要么
IFS=/
var=($PWD)
echo ${var[-1]}
打开内部文件名分隔符(IFS)回到空间。
IFS=
还有就是IFS =后一个空间。
您可以使用基名的实用工具,删除结尾的任何前缀/和后缀(如果存在的串)从字符串,并打印在标准输出结果。
$basename <path-of-directory>
只需使用:
pwd | xargs basename
要么
basename "`pwd`"
我强烈地倾向于使用gbasename
,这是GNU的coreutils的一部分。
下面的命令将导致打印您的当前工作目录在bash脚本。
pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR
我使用这个命令:
dirname "$0"