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

sed or some other command line tool to remove last occuring /

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

您要为此使用的外部工具是 dirname

所以你的函数看起来像这样:

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

    cd -- "$bindir"
}

据说这是两个外部工具,比您在这里真正需要的多两个。

您应该使用 type -pcommand -v 而不是 which。它们都是标准化的(which 不是)并且都是 shell 内置的(which 不是)所以它们更便携,保证在那里,并且会更快他们不会产生外部进程。 (尽管如此,我们无法避免使用 sub-shell。)

这使得函数:

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

    cd -- "$bindir"
}

虽然还有 dirname,但我们不需要为此使用它,我们可以使用 Shell Parameter Expansion 来代替并保存外部进程(以及子 shell 这个时间):

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

    cd -- "$bindir"
}

需要注意的是dirname${var%/*}并不完全相同。在某些极端情况下它们有所不同,但对于这种用法,我认为这些极端情况中的任何一个都不重要。 (有关此差异的更多讨论,请参阅 this fantastic answer。)

您可能会注意到此函数中没有任何错误检查。我们现在应该添加它。

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

    cd -- "$bindir"
}