1

I have the following functions in my ~/.bash_aliases file

mycd() {
  dir=$(cat)
  echo "$dir"
  cd "$dir"
}
alias c=mycd

and

gotoD() {
  find -name $1 -type $2 | awk '{ print $0 }' | sort -k2 | head -1 | c
}
alias goto=gotoD

I want to be able to type

goto directory_name d

and have the functions search for the directory and cd into the nearest one The problem is that though the found path to the directory gets into mycd, it is unable to actually change directories and simple remains in the same directory without any errors.

Any help would be greatly appreciated.

Thanks

4

2 回答 2

3

每当您将命令放入管道时,都会强制该命令作为单独的进程执行。由于每个进程都有自己的当前目录,因此您最终只会更改该进程的当前目录,而不是您输入的 shell 的当前目录。尝试像这样实现 gotoD:

gotoD() {
  cd $(find -name $1 -type $2 | awk '{ print $0 }' | sort -k2 | head -1)
}

现在查找正确目录的逻辑仍然在另一个进程中执行,但cd命令由主进程执行。

于 2013-04-21T13:47:39.167 回答
0

设置正确的 Bash 选项:cdable_vars

您可能正在寻找正确的shopt选项来设置cdable_vars. 手册页说:

cdable_vars

如果设置了此项,则假定 cd 内置命令的一个不是目录的参数是一个变量的名称,该变量的值是要更改到的目录。

这简化了您的解决方案。例如:

shopt -s cdable_vars
goto=/etc
cd goto

但是,您可以使用脚本、函数或管道将目录名称分配给 goto,而不是为 goto 分配静态目录

于 2013-04-21T14:25:47.643 回答