更改目录的 Bash 函数

标签 bash cd

我有一个常见的用例,我想为此编写一个函数:我经常想 cd 到与某个文件相关的某个目录。

我目前的工作流程是这样的:

$ gem which rspec/core | xargs echo -n | pbcopy
$ cd *paste and delete end until direcory looks right*

<子> 注意:gem which rspec/core 打印类似“/Users/joshcheek/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.10.0/lib/rspec/core.rb"

我希望它看起来像这样:

$ gem which rspec/core | 2dir 3

这会将我 cd 到“/Users/joshcheek/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.10.0”(传递参数“3”告诉它删除“lib/rspec/core.rb"从最后开始)

这是迄今为止我得到的最好的:

2dir() {
  read dir
  for i in $(seq 1 $1)
    do
      dir="${dir%/*}"
  done
  cd "$dir"
}

但是 cd 改变了函数的目录,而不是我的。我试过用别名交换它,但不知道如何创建匿名函数或传递参数。

最佳答案

我会使用:

2dir()
{
    name=${2:?'Usage: 2dir count path'}
    count=$1
    while [[ $count -gt 0 ]]; do name=$(dirname "$name"); ((count--)); done
    cd "$name"
}

并将其用作:

2dir 3 $(gem which rspec/core)

这适用于您的管道无法做到的地方。管道进程中的 cd 会影响该(子)shell,但不会影响父进程的当前目录。可以使这个函数起作用。

如果你愿意,你可以使用你的 dir="${dir%/*}" 代替我的 dirname,除了你最终会在如果您在只有 5 个组件时指定 10,则您的主目录而不是当前目录(或根目录,具体取决于您提供的是相对路径名还是绝对路径名)。

关于更改目录的 Bash 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10621483/

相关文章:

bash - 自定义 cd 命令

java - Windows命令脚本无法识别Java程序的CD参数

bash - 运行 cd 时 Shell 脚本认为目录不存在

bash - 1 : command not found

macos - 从终端的钥匙串(keychain)中删除私钥

bash - 在 bash 中的字母处剪切数字字符串

linux - 用于监视磁盘 IO 的 shell 脚本无法正常工作

bash - 从 bash 循环中收集唯一数据项的数组——readarray 不追加?

linux - 如何在linux中指定文件内有空格的路径

bash - 使用波浪号将目录更改为文件中指定的路径