我经常想切换到特定可执行文件所在的目录。所以我想要类似的东西
cd `which python`
更改为安装 python 命令的目录。然而,这显然是非法的,因为 cd 需要一个目录,而不是一个文件。显然,我可以做一些 regexp-foo 来删除文件名,但这会破坏它是一个简单的单线的意义。
这里:
cd $(dirname `which python`)
编辑:
更简单(这次实际测试了):
function cdfoo() { cd $(dirname `which $@`); }
然后是“cdfoo python”。
为了避免所有这些外部程序('dirname' 和更糟糕的是,无用但流行的 'which')可能需要重写:
cdfoo() {
tgtbin=$(type -P "$1")
[[ $? != 0 ]] && {
echo "Error: '$1' not found in PATH" >&2
return 1
}
cd "${tgtbin%/*}"
}
这也修复了上面不常见的关键字“function”并添加了(非常简单的)错误处理。
可能是一个更复杂的解决方案的开始。
为了比较:
zsh:~% cd =vi(:h) zsh:/usr/bin%
=cmd 扩展为 cmd 的路径, (:h) 是一个全局修饰符,用于获取头部
zsh 是只写但功能强大。
类似的东西应该可以解决问题:
cd `dirname $(which python)`
我使用过的一项功能是 pushd / popd。它们维护一个目录堆栈,因此如果您希望在更改目录之前返回到当前工作目录,则不必尝试保留您所在位置的历史记录。
例如:
pushd $(dirname `which $@`)
...
popd
你可以使用这样的东西:
cd `which <file> | xargs dirname`
我添加了一些简单的错误处理,使 cdfoo() 的行为遵循 dirname 对于不存在/非路径参数的行为
function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}