Shell 修剪到最新任意文件夹名称的路径

Shell 修剪到最新任意文件夹名称的路径,shell,makefile,Shell,Makefile,我正在编写一个makefile,在这里我可以访问文件运行的路径MKFILE_路径 MKFILE\u PATH=$(abspath$(lastword$(MAKEFILE\u LIST))) 我想修剪这条路径,切断最后一个包的末端 以下是一些例子: 输入:/Users/thomasreggi/Desktop/monorepo/packages/event as promisted/packages/node_modules/.bin/ied 输出:/Users/thomasreggi/Deskt

我正在编写一个makefile,在这里我可以访问文件运行的路径<代码>MKFILE_路径

MKFILE\u PATH=$(abspath$(lastword$(MAKEFILE\u LIST)))

我想修剪这条路径,切断最后一个
包的末端

以下是一些例子:

  • 输入:
    /Users/thomasreggi/Desktop/monorepo/packages/event as promisted/packages/node_modules/.bin/ied
  • 输出:
    /Users/thomasreggi/Desktop/monorepo/packages/event作为承诺

  • 输入:
    /Users/thomasreggi/Desktop/monorepo/packages/event as promised/node_modules/.bin/ied

  • 输出:
    /Users/thomasreggi/Desktop/monorepo

如何使用shell/make操作路径?

我们可以使用参数替换从字符串右端删除最短的匹配部分,如下所示:

$ var="/Users/thomasreggi/Desktop/monorepo/packages/event-as-promised/packages/node_modules/.bin/ied"
$ echo "${var%packages*}"
/Users/thomasreggi/Desktop/monorepo/packages/event-as-promised/
$ var="/Users/thomasreggi/Desktop/monorepo/packages/event-as-promised/node_modules/.bin/ied"
$ echo "${var%packages*}"
/Users/thomasreggi/Desktop/monorepo/
${var%Pattern}
表示从
$var
中删除与
$var
后端(从右侧)匹配的模式最短部分

要删除最长的匹配部分,我们可以使用
${var%%Pattern}


有关参数替换的更多信息,请参见

嘿,谢谢!出于某种原因,这在终端中有效,但在makefile中无效。知道为什么吗?在Make配方中,shell变量是用双美元符号访问的。您可能需要类似于
var='$(MAKEVARIABLE)';echo“$${var%packages*}”