一个bash-one-liner命令,将其更改为某个文件所在的目录

一个bash-one-liner命令,将其更改为某个文件所在的目录,bash,cd,Bash,Cd,我经常想切换到特定可执行文件所在的目录。所以我想要一些 cd `which python` 切换到安装python命令的目录。然而,这显然是非法的,因为cd是一个目录,而不是一个文件。显然,我可以做一些regexp-foo来去除文件名,但这会破坏它的简单性。这里: cd $(dirname `which python`) 编辑: 更简单(这次实际测试): 然后是“cdfoo-python”。类似的东西应该可以做到: cd `dirname $(which python)` 您可以使用以下

我经常想切换到特定可执行文件所在的目录。所以我想要一些

cd `which python` 
切换到安装python命令的目录。然而,这显然是非法的,因为cd是一个目录,而不是一个文件。显然,我可以做一些regexp-foo来去除文件名,但这会破坏它的简单性。

这里:

cd $(dirname `which python`)
编辑:

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


然后是“cdfoo-python”。

类似的东西应该可以做到:

cd `dirname $(which python)`

您可以使用以下内容:

cd `which <file> | xargs dirname`
cd`which | xargs dirname`

我在allot中使用的一个特性是pushd/popd。它们维护一个目录堆栈,这样,如果您希望在更改目录之前返回到当前工作目录,就不必尝试保留您所在位置的历史记录

例如:

pushd $(dirname `which $@`)
...
popd

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

cdfoo() {
  tgtbin=$(type -P "$1")
  [[ $? != 0 ]] && {
    echo "Error: '$1' not found in PATH" >&2
    return 1
  }
  cd "${tgtbin%/*}"
}
这还修复了上面不常见的关键字“function”,并添加了(非常简单的)错误处理


可能是一个更加抽象的解决方案的开始。

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

function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}
作为比较:

zsh:~% cd =vi(:h) zsh:/usr/bin% zsh:~%cd=vi(:h) zsh:/usr/bin% =cmd扩展到cmd的路径,(:h)是一个全局修饰符,用于获取头部


zsh只写,但功能强大。

我应该在领先的时候停下来。。。编辑以删除伪造的别名表单。嵌套$()有效:函数cdfoo(){cd$(dirname$(which$@));}这不适用于包含空格的程序(尽管在*nix中使用此类程序的任何人都应该被枪杀);这可以通过在$@周围加上双引号来解决。实际上,即使加上引号,“which”也会阻塞,因为它显然会重新标记其参数。
这很糟糕。没有引用也很糟糕。使用$@,尤其是不带引号的,当只允许一个参数时,也很糟糕。cdto(){local to=$(键入-P“$1”);cd“${to%/*}”;}
zsh:~% cd =vi(:h)
zsh:/usr/bin%