一个bash one-liner,可以切换到某个文件所在的目录

时间:2009-05-13 01:10:19

标签: bash cd which

我经常想要更改到特定可执行文件所在的目录。所以我想要像

这样的东西
cd `which python` 

切换到安装python命令的目录。但是,这显然是非法的,因为cd占用目录,而不是文件。显然有一些regexp-foo可以用来去掉文件名,但这样做会使它成为一个简单的单行代码。

7 个答案:

答案 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 ) ));}