1

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

4

1 回答 1

1

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

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

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

    cd -- "$bindir"
}

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

您应该使用type -pcommand -v代替which. 它们都是标准化的(which不是)并且都是外壳内置的(which不是),因此它们更便携,保证在那里,并且由于它们不会产生外部进程而更快。(不过,我们无法避免这些子外壳。)

这使得函数:

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

    cd -- "$bindir"
}

但这仍然存在dirname,我们不需要为此使用它,我们可以使用Shell Parameter Expansion代替并保存外部进程(以及这次的子 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"
}
于 2015-05-01T03:15:39.503 回答