Answers:
这必须是shell函数,而不是脚本,因为脚本在新的shell中执行(因此无法更改原始shell的目录)。
function cdroot()
{
while [[ $PWD != '/' && ${PWD##*/} != 'httpdocs' ]]; do cd ..; done
}
当然,您可以随意命名该函数。
一些解释:如果不在httpdocs文件夹中,则第一个测试($PWD != '/'
)是故障保护cdroot
。扎根后它将停止。
第二个测试(${PWD##*/} != 'httpdocs'
)有点复杂。 $PWD
是一个包含当前目录路径的变量。${PWD##*/}
修剪所有内容,直到最后一个斜杠为止。
我的upto
.bashrc中有一个函数,该函数可让您按名称转到当前路径上的任何目录:
upto ()
{
if [ -z "$1" ]; then
return
fi
local upto=$1
cd "${PWD/\/$upto\/*//$upto}"
}
我也有此功能的完成,因此当我点击tab时,它会给我有效的目录名称和完成:
_upto()
{
local cur=${COMP_WORDS[COMP_CWORD]}
local d=${PWD//\//\ }
COMPREPLY=( $( compgen -W "$d" -- "$cur" ) )
}
complete -F _upto upto
此外,我还有另一个功能jd
,可让我跳至当前目录下的任何目录:
jd(){
if [ -z "$1" ]; then
echo "Usage: jd [directory]";
return 1
else
cd **"/$1"
fi
}
例:
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto h[TAB][TAB]
habitat hippopotamus
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto hippopotamus
[/www/public_html/animals/hippopotamus] $ jd images
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $
upto httpdocs
。
jd
并非在每种情况下都有效,您介意解释一下它的工作原理吗?
**
)。要在bash shell中启用此功能,请使用shopt -s globstar
。
jd
函数中包括了动态购物车检测和激活,请参阅gist.github.com/Rob--W/5888648。我只用Bash 4.2.45进行了测试,所以是YMMV。
您.bashrc
可以想到的最简单的bash函数(之所以简单,是因为它不使用循环或外部进程)是:
cdup() {
cd "${PWD/\/httpdocs\/*//httpdocs}"
}
这使用Pattern替换参数扩展将/httpdocs/
in 之后的所有内容替换$PWD
为`/ httpdocs'。看起来非常混乱,因为我们必须在路径中转义正斜杠以使其与bash扩展语法中的正斜杠区分开。另外,不要在替换字符串中转义正斜杠,因此它看起来也不一致。
如果/httpdocs/
当前路径中没有任何内容,则将不执行任何替换,它将替换为当前目录。
例如,替换将替换/a/b/c/httpdocs/e/f/g
为/a/b/c/httpdocs
并cd
进入该目录。
该功能必须位于当前的shell环境中(作为功能或别名),因为子进程无法更改其父目录的当前目录。这就是为什么我说要把它放在您的.bashrc
而不是shell脚本中的原因。
它不能完全解决您的问题,但是可以节省一些时间cd ../../../../../../
。我从这里的user unknown帖子中借来的。
不用打字
cd ../../../..
你只要输入
up 4
还有一个
cd -
会带你回来
将该函数放入您的.bashrc中以使用它。
# (c) 2007 stefan w. GPLv3
function up {
ups=""
for i in $(seq 1 $1)
do
ups=$ups"../"
done
cd $ups
}
cd -
后才能回到原来位置的能力。