01:如何获取当前脚本的路径

个现实的问题是:脚本中经常需要写一些路径,比如文件夹,文件名等;

我们可以简单的把所有路径写成绝对路径,但这为之后迁移、升级挖下了“坑”。

于是:我们希望把所有的这些路径信息或其它配置信息放在单独的文件中,然后在脚本使用之前source进去。

一个经典的作法是:定义一个根路径,然后所有路径依赖于这个根路径来生成相对路径;

但事实上这样做可能还是不够好,你可能需要配置很多东西,然后每次迁移的时候都要改配置文件。经典的书箱《Unix编程艺术》中关于可配置的经典总结是:

  • 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个文件的形式写入输出;

猜你喜欢

转载自zang232.iteye.com/blog/1731609