Ste*_*eet 5 bash shell scripting ksh
KornShell(ksh)曾经有一个非常有用的选项来cd遍历类似的目录结构; 例如,给出以下目录:
/home/sweet/dev/projects/trunk/projecta/app/models /home/andy/dev/projects/trunk/projecta/app/models然后,如果您在/home/sweet...目录中,则可以通过键入更改为andy结构中的等效目录
cd sweet andy
Run Code Online (Sandbox Code Playgroud)
因此,如果ksh看到2个参数,那么它将扫描当前目录路径中的第一个值,将其替换为第二个和cd.有人知道Bash内置了类似的功能吗?或者如果没有,那么让Bash以同样的方式工作的黑客攻击呢?
到目前为止提供的其他解决方案存在以下一个或多个问题:
/canis/lupus/lupus/或/nicknames/Robert/Rob/此版本处理上面列出的所有问题.
cd ()
{
local pwd="${PWD}/"; # we need a slash at the end so we can check for it, too
if [[ "$1" == "-e" ]]
then
shift
# start from the end
[[ "$2" ]] && builtin cd "${pwd%/$1/*}/${2:-$1}/${pwd##*/$1/}" || builtin cd "$@"
else
# start from the beginning
[[ "$2" ]] && builtin cd "${pwd/\/$1\///$2/}" || builtin cd "$@"
fi
}
Run Code Online (Sandbox Code Playgroud)
cdX从这样的目录发出我将调用的任何其他版本:
/canis/lupus/lupus/specimen $ cdX lupus familiaris
bash: cd: /canis/familiaris/lupus/specimen: No such file or directory
如果"狼疮"的第二个实例是预期的那个则失败.为了适应这种情况,您可以使用" -e"选项从目录结构的末尾开始.
/canis/lupus/lupus/specimen $ cd -e lupus familiaris
/canis/lupus/familiaris/specimen $
或者从这一个发出其中一个:
/nicknames/Robert/Rob $ cdX Rob Bob
bash: cd: /nicknames/Bobert/Rob: No such file or directory
将无意中替换部分字符串.我的函数通过在匹配中包含斜杠来处理这个问题.
/nicknames/Robert/Rob $ cd Rob Bob
/nicknames/Robert/Bob $
您还可以明确地指定目录,如下所示:
/fish/fish/fins $ cd fish/fins robot/fins
/fish/robot/fins $
顺便说一句,我用了控制经营者&&和||在我的功能,而不是if... ... then... ... else... ... fi只是为了各种缘故.