个现实的问题是:脚本中经常需要写一些路径,比如文件夹,文件名等;
我们可以简单的把所有路径写成绝对路径,但这为之后迁移、升级挖下了“坑”。
于是:我们希望把所有的这些路径信息或其它配置信息放在单独的文件中,然后在脚本使用之前source进去。
一个经典的作法是:定义一个根路径,然后所有路径依赖于这个根路径来生成相对路径;
但事实上这样做可能还是不够好,你可能需要配置很多东西,然后每次迁移的时候都要改配置文件。经典的书箱《Unix编程艺术》中关于可配置的经典总结是:
|
总结起来就是:能够可靠检测的东西是不应该配置的;
如我们会经常检测当前的操作系统(java可以通过os.name属性得到),然后做一些处理等;那现在的问题是:能够在shell中获取可靠的当前路径嘛?
答案是肯定的。
| 经典的linux软件包的结构如左图所示: 我们假设我们的需求是:放置在bin目录中的脚本,能够自动识别找到logs目录,将脚本产生的输出写到logs目录中。 你可以通过如下的脚本来完成这个任务: |
bin=$(dirname "$0") #$0表示当前脚本名称,dirname获取当前脚本的所在目录
bin=$(cd "$bin";pwd) #cd到这个目录可以保证链接目录找到源,通过pwd获取真实目录
base=$(cd "$bin";cd ..;pwd) #cd ..可以返回bin的上层目录,也就是根目录
logs="${base}/logs" #依据根目录,我们找到了相对根目录的logs目录
mkdir -p ${logs}/test #mkdir -p 可以保证在logs目录不存在的情况下我们自动生成(所有的父目录);
echo "test" \
> "${logs}/test/$(date +%Y-%m-%d).log" 2>&1 #最后我们可以把执行结果以每天1个文件的形式写入输出;