8

我经常想切换到特定可执行文件所在的目录。所以我想要类似的东西

cd `which python` 

更改为安装 python 命令的目录。然而,这显然是非法的,因为 cd 需要一个目录,而不是一个文件。显然,我可以做一些 regexp-foo 来删除文件名,但这会破坏它是一个简单的单线的意义。

4

7 回答 7

16

这里:

cd $(dirname `which python`)

编辑:

更简单(这次实际测试了):

function cdfoo() { cd $(dirname `which $@`); }

然后是“cdfoo python”。

于 2009-05-13T01:16:09.783 回答
8

为了避免所有这些外部程序('dirname' 和更糟糕的是,无用但流行的 'which')可能需要重写:

cdfoo() {
  tgtbin=$(type -P "$1")
  [[ $? != 0 ]] && {
    echo "Error: '$1' not found in PATH" >&2
    return 1
  }
  cd "${tgtbin%/*}"
}

这也修复了上面不常见的关键字“function”并添加了(非常简单的)错误处理。

可能是一个更复杂的解决方案的开始。

于 2009-05-13T04:29:25.543 回答
3

为了比较:

zsh:~% cd =vi(:h)
zsh:/usr/bin%

=cmd 扩展为 cmd 的路径, (:h) 是一个全局修饰符,用于获取头部

zsh 是只写但功能强大。

于 2009-05-13T05:04:23.847 回答
2

类似的东西应该可以解决问题:

cd `dirname $(which python)`
于 2009-05-13T01:18:12.150 回答
2

我使用过的一项功能是 pushd / popd。它们维护一个目录堆栈,因此如果您希望在更改目录之前返回到当前工作目录,则不必尝试保留您所在位置的历史记录。

例如:

pushd $(dirname `which $@`)
...
popd
于 2009-05-13T03:23:47.407 回答
1

你可以使用这样的东西:

cd `which <file> | xargs dirname`
于 2009-05-13T01:18:34.160 回答
0

我添加了一些简单的错误处理,使 cdfoo() 的行为遵循 dirname 对于不存在/非路径参数的行为

function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}
于 2009-05-13T05:00:31.810 回答