编程文汇

linux shell: 进入当前脚本所在目录

问题

在给程序写一个脚本的时候, 我们往往希望在执行这个脚本的时候工作目录就在这个程序的根目录下, 这样我们可以从当前目录下获取配置 以及写入日志. 但是, 如果别人是在别的目录下执行我们的启动脚本怎么办? 我们能否自动转到程序的根目录呢?

实例

比如下图, 我们要从dir1/run.sh调用 tun/runclient.sh, 那这时的工作目录很明显是dir1, 如果这样的话 runclient.sh就不能正常运行, 因为路径不对.

dir1/
├──run.sh
└
tun/
├── cfg
│   ├── log4j2.xml
├── libs
│   ├── commons-logging-1.2.jar
├── logs
│   ├── log-2019-08-17.1.his.txt
│   └── log.txt
└── runclient.sh

解决办法

此时 如果我们能够在runclient.sh里增加一个命令, 让它先进入runclient.sh所在目录 , 那么问题就解决了.
(sh脚本里的cd命令只对本文件有效, 本文件执行结束, 就会回到调用者的目录):

# runclient.sh 
cd "$(dirname "$0")"
......
......

这样就可以了, dirname 命令是获取文件所在的目录, 这是相对目录, cd 以后, 就到了脚本所在目录.
此时, 程序就可以获取当前目录下的配置, 在当前目录下打印日志.

这种方式是很方便的, 因为 不需要在脚本中写死绝对路径, 很灵活, 很稳定. 不容易出错.