我想在我的 bashrc 中创建一个函数 cwhich ,它将 $1 的结果存储在路径 var 中,然后 cd 到它。但是这样会启动一个软件,比如cwhich python、cwhich blender等。我想把最后出现的/后面的文字截掉,然后cd到有效目录。这只是一个小小的不便,但通过寻找或寻求解决方案,我希望变得更加务实、高效和知识渊博。帮助表示赞赏。
问问题
36 次
1 回答
1
您要为此使用的外部工具是dirname
.
所以你的函数看起来像这样:
cwhich() {
local bin=$(which "$1")
local bindir=$(dirname -- "$bin")
cd -- "$bindir"
}
话虽如此,这是两个外部工具,这比您在这里真正需要的要多两个。
您应该使用type -p
或command -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 回答