我的〜/ .bash_aliases文件中有以下功能
mycd() {
dir=$(cat)
echo "$dir"
cd "$dir"
}
alias c=mycd
和
gotoD() {
find -name $1 -type $2 | awk '{ print $0 }' | sort -k2 | head -1 | c
}
alias goto=gotoD
我希望能够输入
goto directory_name d
并让函数搜索目录并cd到最近的目录 问题是,虽然找到的目录路径进入mycd,但它无法实际更改目录,并且简单地保留在同一目录中而没有任何错误。
非常感谢任何帮助。
由于
答案 0 :(得分:3)
每当您将命令放入管道时,都会强制该命令作为单独的进程执行。由于每个进程都有自己的当前目录,因此您最终只能更改一个进程的当前目录,而不是您输入的shell的当前目录。尝试实现gotoD,如下所示:
gotoD() {
cd $(find -name $1 -type $2 | awk '{ print $0 }' | sort -k2 | head -1)
}
现在找到正确目录的逻辑仍在另一个进程中执行,但cd
命令由主进程执行。
答案 1 :(得分:0)
您可能正在寻找正确的 shopt 选项来设置cdable_vars
。 manual page说:
cdable_vars
如果设置了此项,则假定cd builtin命令不是目录的参数是变量的名称,该变量的值是要更改的目录。
这简化了您的解决方案。例如:
shopt -s cdable_vars
goto=/etc
cd goto
但是,您可以使用脚本,函数或管道将目录名称分配给 goto ,而不是将静态目录分配给goto。