sed或其他命令行工具删除最后出现的/



我想在我的bashrc中创建一个函数cwhich,它将把which$1的结果存储在一个路径var中,然后cd到它。但这将启动一个软件,如cwhich-python、cwhich-blender等。我想在最后一次出现后剪切文本/然后cd到有效目录。这只是一个小小的不便,但通过寻找或寻求解决方案,我希望变得更加务实、高效和知识渊博。感谢您的帮助。

要用于此操作的外部工具是dirname

所以你的函数应该是这样的:

cwhich() {
local bin=$(which "$1")
local bindir=$(dirname -- "$bin")
cd -- "$bindir"
}

话虽如此,这是两个外部工具,比你真正需要的多了两个。

您应该使用type -pcommand -v而不是which。它们都是标准化的(which不是),都是shell内置的(which不是),所以它们更具可移植性,保证在那里,而且速度更快,因为它们不会产生外部进程。(尽管如此,我们还是无法避免使用子外壳。)

这使得功能:

cwhich() {
local bin=$(command -v -- "$1")
local bindir=$(dirname -- "$bin")
cd -- "$bindir"
}

尽管如此,这仍然留下了dirname,我们不需要为此使用它,我们可以使用Shell参数展开,并保存外部进程(以及这次的子Shell):

cwhich() {
local bin=$(command -v -- "$1")
local bindir=${bin%/*}
cd -- "$bindir"
}

应当注意的是,dirname${var%/*}不是严格相同的。有些角落的情况有所不同,但对于这种用法,我认为这些角落的情况都不重要。(有关这种差异的更多讨论,请参阅这个奇妙的答案。)

您可能会注意到,在这个函数中没有任何错误检查。我们现在可能应该加上这一点。

cwhich() {
local bin=$(command -v -- "$1")
local bindir=${bin%/*}
{ [ -z "$bin" ] || [ -z "$bindir" ]; } && return
cd -- "$bindir"
}

相关内容

  • 没有找到相关文章

最新更新