如何在bash脚本中获取当前工作目录名称,甚至更好,只需一个终端命令.
pwd给出了当前工作目录的完整路径,例如/opt/local/bin但我只想要bin
Cha*_*ffy 1033
不需要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.
Run Code Online (Sandbox Code Playgroud)
请注意,如果您在其他情况下应用此技术(不是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"
Run Code Online (Sandbox Code Playgroud)
或者,没有extglob:
dirname="/path/to/somewhere//"
result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim
result="${result##*/}" # remove everything before the last /
Run Code Online (Sandbox Code Playgroud)
Ark*_*ady 290
使用该basename程序.对于你的情况:
% basename "$PWD"
bin
Run Code Online (Sandbox Code Playgroud)
Dig*_*oss 134
$ echo "${PWD##*/}"
Run Code Online (Sandbox Code Playgroud)
小智 23
您可以使用pwd和basename的组合.例如
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
Run Code Online (Sandbox Code Playgroud)
小智 15
grep怎么样:
pwd | grep -o '[^/]*$'
Run Code Online (Sandbox Code Playgroud)
Fir*_*Sky 15
用:
basename "$PWD"
Run Code Online (Sandbox Code Playgroud)
或者
IFS=/
var=($PWD)
echo ${var[-1]}
Run Code Online (Sandbox Code Playgroud)
将内部文件名分隔符 (IFS) 转回空格。
IFS=
Run Code Online (Sandbox Code Playgroud)
IFS 后面有一个空格。
我喜欢选中的答案(Charles Duffy),但如果你在符号链接的目录中并且想要目标目录的名称,请小心.不幸的是我不认为它可以在单个参数扩展表达式中完成,也许我错了.这应该工作:
target_PWD=$(readlink -f .)
echo ${target_PWD##*/}
Run Code Online (Sandbox Code Playgroud)
要看到这个,一个实验:
cd foo
ln -s . bar
echo ${PWD##*/}
Run Code Online (Sandbox Code Playgroud)
报告"酒吧"
要显示路径的前导目录(不产生/ usr/bin/dirname的fork-exec):
echo ${target_PWD%/*}
Run Code Online (Sandbox Code Playgroud)
这将改变foo/bar/baz - > foo/bar
echo "$PWD" | sed 's!.*/!!'
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Bourne shell或${PWD##*/}不可用.
小智 6
basename $(pwd)
Run Code Online (Sandbox Code Playgroud)
或者
echo "$(basename $(pwd))"
Run Code Online (Sandbox Code Playgroud)
有很多方法可以做到这一点,我特别喜欢Charles方式,因为它避免了新的进程,但在知道这一点之前,我用 awk 解决了它
pwd | awk -F/ '{print $NF}'
Run Code Online (Sandbox Code Playgroud)
只需运行以下命令行:
basename $(pwd)
Run Code Online (Sandbox Code Playgroud)
如果您想复制该名称:
basename $(pwd) | xclip -selection clipboard
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,没有人提到这种仅使用内置 bash 命令的替代方案:
i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"
Run Code Online (Sandbox Code Playgroud)
作为额外的奖励,您可以通过以下方式轻松获取父目录的名称:
[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"
Run Code Online (Sandbox Code Playgroud)
这些将适用于 Bash 4.3-alpha 或更新版本。
小智 5
我通常在 sh 脚本中使用它
SCRIPTSRC=`readlink -f "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
echo "Running from ${RUN_PATH}"
...
cd ${RUN_PATH}/subfolder
Run Code Online (Sandbox Code Playgroud)
你可以用它来自动化事情......
小智 5
对于像我这样的寻找骑师:
find $PWD -maxdepth 0 -printf "%f\n"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
635055 次 |
| 最近记录: |