【问题标题】:bash equivalent to tcsh modifiers for extracting path componentsbash 等效于 tcsh 修饰符,用于提取路径组件
【发布时间】:2019-02-08 16:24:52
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这与How to get name of second last folder in linuxHow to get the last part of dirname in bash 密切相关,如果不是完全重复的话。
  • @CharlesDuffy 不是。这个问题是关于修饰符而不是关于“如何从路径中提取 n 的元素”
  • 但是,这样的“修饰符”(在 bash 中,这些都称为parameter expansion 形式)都是实现目标的手段的子集。因此,上面链接的预先存在的问答条目确实讨论了它们——例如,请参阅this answer
  • 坦率地说,如果您将答案限制在“我如何在 bash 中执行 X?”到“我如何使用语法 Y 的直接模拟在 bash 中执行 X?”,我质疑该问题在本质上是否实用,正如our on-topic definition 所要求的那样。 (如果您知道 a 意味着做 X,那么要求更快或更简洁的方法是公平的,但不同的是 只是因为......好吧,什么是实用点?)
  • @CharlesDuffy ...坦率地说,是的,查尔斯,这个问题非常实用。否则我没有被问到:-)。感谢 jhnc 、 chepner 和许多其他发布解决方案的 stackoverflow 用户,他们没有试图展示他们对“我们的主题定义”的“聪明”程度。伙计们——你们真的帮助了我。非常感谢!

标签: bash tcsh


【解决方案1】:

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

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

!!:1 选择前一个命令的第 1 个字(从零开始计数),因此参数为 cd

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

【讨论】:

  • 有没有办法让这个输出不在标准错误中或者我需要使用重定向技巧?
【解决方案2】:

在非交互式 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

【讨论】:

  • 历史扩展不是行编辑,可以为非交互式shell启用(虽然我不推荐)。
【解决方案3】:
cd /some/long/path/somewhere
x=$PWD
basename "$(dirname "$x")"
>  path

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

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

【讨论】:

  • $PWD 不应有斜杠。如果可以,y=${x%%/} 将剥离任何内容。也许值得在你的答案中注释什么等于:h 和什么等于:t
  • @jhnc,记住了一个更好的方法
  • 你的意思是basename "$(dirname "$x")",对吧?只是x 不会查看变量的值,如果没有引号,带有空格的目录名就会出现问题。
  • 这并不完全是 bash。如果您打算这样做,也可以将其输入 perl。 :p
猜你喜欢
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2011-07-14
相关资源
最近更新 更多