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

bsd*_*ish 8 bash cd which

我经常想要更改到特定可执行文件所在的目录.所以我喜欢类似的东西

cd `which python` 
Run Code Online (Sandbox Code Playgroud)

切换到安装python命令的目录.但是,这显然是非法的,因为cd占用目录,而不是文件.显然有一些regexp-foo我可以做的去除文件名,但这会打败它是一个简单的单行.

Lan*_*son 16

这里:

cd $(dirname `which python`)
Run Code Online (Sandbox Code Playgroud)

编辑:

更容易(这次实际测试):

function cdfoo() { cd $(dirname `which $@`); }
Run Code Online (Sandbox Code Playgroud)

然后"cdfoo python".

  • 嵌套$()有效:函数cdfoo(){cd $(dirname $(其中$ @)); } (2认同)
  • 这对于包含空格的程序不起作用(尽管任何在*nix中使用此类程序的人都应该被拍摄); 可以通过在$ @周围加上双引号来修复. (2认同)

The*_*sai 8

为了避免所有那些外部程序('dirname',更糟糕的是,无用但流行的'哪个')可能有点重写:

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

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

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