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