bash等同于tcsh修饰符,用于提取路径分量

时间:2019-02-08 16:24:52

标签: bash tcsh

在tcsh中,我可以按照以下方式从路径的末尾提取第二个路径元素

cd /some/long/directory/structure/path/
set x=`pwd`
echo ${x:h:h:t}
directory

我如何在bash中做同样的事情?

我的意思是,bash也有这种修饰符吗?

3 个答案:

答案 0 :(得分:3)

csh样式的修饰符可以与历史记录扩展一起使用(毫不奇怪,因为历史记录扩展是从csh借用的。)

$ cd /some/long/directory/structure/path/
$ echo !!:1:h:h:t
echo directory
directory

!!:1选择上一条命令的单词1(从零开始计数),因此选择cd的参数。

({echo directory出现在标准错误上,因为外壳默认在实际执行结果命令之前显示历史扩展的结果。)

答案 1 :(得分:1)

在非交互式bash脚本中,@ chepner的答案中的历史记录扩展命令通常将不可用。但是,您确实有参数扩展,例如:

$ cd /some/long//directory///structure/path/
$ set x=$(pwd)
$ echo $x
/some/long/directory/structure/path
$ y=${y%/*/*}      # each /* is equivalent to one :h
$ y=${y##*/}       # equivalent to :t
$ echo $y
directory

答案 2 :(得分:0)

cd /some/long/path/somewhere
x=$PWD
basename "$(dirname "$x")"
>  path

dirname获取参数的父文件夹的绝对路径。 basename获取参数的名称。

编辑:记住了比以前更好的方法。