最近在配置一台Linux服务器,需要频繁的操作cd命令,到不同的文件路径下,总是感觉很麻烦。由于之前的一家公司,公司大佬写了一个脚本,就是在第一次进入某个目录下时,save一个别名,然后下次只要执行【go 别名】就能直接进入到之前的那个目录,个人感觉那个脚本体验感很好。所以,我也想实现这个功能,奈何技术很菜,只能写一个简易版的脚本。
一:保存别名以及路径脚本【s】
首先,我说一下脚本实现的简单逻辑。当我进入到某一个目录底下时,我要将别名和目录的地址(就是pwd显示的绝对路径地址)保存下来,保存在path.txt中,格式如下:
别名1:路径1
别名2:路径2
别名3:路径3
然后,当我想进入某一个目录时,我输入别名,我能根据别名找到那个绝对路径,然后执行cd 命令。比如我执行【go 别名1】,当前终端能进入【路径1】中。
ok,基本思路确定,首先是save命令,我先在/bin目录下新建一个s脚本,如下:
#!/bin/bash
param=$1
CURRENT=`pwd`;
while read -r line; do
pname=`echo $line | cut -d \: -f 1`;
if [[ $param != $pname ]];then
echo "${line}"
echo "${line}" >> /bin/path2.txt
fi
done < /bin/path.txt
echo "${param}:${CURRENT}" >> /bin/path2.txt
rm -rf /bin/path.txt
mv /bin/path2.txt /bin/path.txt
【param】标识存的别名,【CURRENT】为当前路径
这里呢,有一个问题,当我存一个已经存在的别名时,我需要将原本的别名的绝对路径替换掉。
比如:我在【路径1】下存入【别名1】,然后我在【路径2】也存入【别名1】,此时我需要将path.txt中的【别名1】的路径更新【路径2】。
然后再网上查到Linux用户替换或者删除文本内容的命令【sed】,但是我在编写使用时,总是报错,总之就是我太菜了,不会用。
所以我就换了一个方法代替【sed】应该执行的【替换或者删除】功能,具体就是:
1:每次执行s命令时,循环读取path.txt的每一行,获取【别名x】
2:判断【别名x】与当前存入【别名y】是不是相同,不相同,追加存入path2.txt,相同不做处理
3:循环读取结束后,将【别名y】以及当前的路径追加存入path2.txt
4:删除path.txt,然后将path2.txt重命名为path.txt
二:快速进入路径脚本【g】
因为在【s】脚本中,已经将【别名】以及路径保存在path.txt中,所以【g】脚本需要将【别名】对应的【路径】找到,然后cd到【路径】下。
#!/bin/bash
param=$1
GO_PATH="/root";
while read -r line; do
l=$line;
pname=`echo $line | cut -d \: -f 1`;
TXT_PATH=`echo $line | cut -d \: -f 2`;
if [[ $param = $pname ]];then
GO_PATH=$TXT_PATH;
break;
fi
done < /bin/path.txt
cd $GO_PATH;
pwd;
最后将两个脚本赋权:chmod -R 777 s,chmod -R 777 g。
当我满心欢喜的觉得搞定了时,不管我怎么使用g命令,就是不能进入目标路径。j就像这样:
明明pwd打印的路径是对的,但是命令行的路径还在原地不动,人傻了啊,菜鸡怀疑人生啊。
最后网上查了一下,大概的原因呢就是shell脚本在执行cd命令是,会创建一个子shell,然后把子shell的操作路径切换到目标位置了。但是,我需要的是当前执行脚本的命令行跳转路径啊。最后在网上找到了source命令,用source (也可以用 . 代替source)命令去执行脚本,就能跳转。
不知道有没有大佬指点一下,能否不用source命令,实现这样的功能,或者在我的脚本上将source命令融合进去。(我个人试过在【g】脚本中,将source加在 cd 命令之前,但是貌似不生效)。
最后,看一下一个完整的操作过程:
1:原本的path.txt
2:存入新的内容
3: 用新的别名进入路径
4:新路径存入相同的别名,并执行