1

出于 GNU 屏幕标题的目的,我想获取当前目录名称,前缀为其父名称。例如,在目录中

/home/rhys/share/pkgconfig
/home/rhys
/home
/

产生产出

share/pkgconfig
home/rhys
home
/

在 Bash 中,从猜测开始

echo $(basename $(dirname $PWD))/$(basename $PWD)

可以找到更好的解决方案

echo $(basename "${PWD%/*}")/${PWD##*/}

我说得更好,因为产生了两个更少的进程。

有人有一个可爱的技巧可以完全避免使用basename吗?这是为了运行每个 shell 提示符,所以尽可能轻量级会很好。

4

3 回答 3

0
for p in /home/rhys/share/pkgconfig /home/rhys /home /; do
  [[ $p =~ .*/([^/]+/[^/]+)$ ]] && echo "${BASH_REMATCH[1]}" || echo "$p"
done

作为一个函数:

last2() { [[ $1 =~ .*/([^/]+/[^/]+)$ ]] && echo "${BASH_REMATCH[1]}" || echo "$1"; }

应该在bash>= 3.2上工作

于 2014-03-27T19:57:26.407 回答
0

这个怎么样,使用 bash 和 awk:

awk -F'/' '{print $(NF-1)"/"$NF}' <<<"$PWD"

编辑

前一个不太正确,因为它打印/home而不仅仅是home. 也许你可以忍受。如果没有,这个完全有效:

awk -F'/' '{if (NF==2 && $2) {$0=$2} else {$0=$(NF-1)"/"$NF}}1' <<<"$PWD"

测试一下:

awk -F'/' '{if (NF==2 && $2) {$0=$2} else {$0=$(NF-1)"/"$NF}}1' <<EOF
/home/rhys/share/pkgconfig
/home/rhys
/home
/
EOF

输出:

share/pkgconfig
home/rhys
home
/
于 2014-03-27T17:25:48.953 回答
0

这是一个将在bash4 或更高版本中工作的函数:

trim () (
  IFS=/
  read -a c <<< "$1"
  unset c[0]
  fragment="${c[*]: -2:2}"
  echo "${fragment:-/}"
)

for p in /home/rhys/share/pkgconfig /home/rhys /home /; do
  trim "$p"
done

share/pkgconfig
home/rhys
home
/
于 2014-03-27T17:54:35.320 回答