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