【5.2】bash获取路径

一、执行路径

pwd

该命令的作用是“print name of current/working directory”,这才是此命令的真实含义,当前的工作目录,这里没有任何意思说明,这个目录就是脚本存放的目录。所以,这是不对的。你可以试试 bash shell/a.sh,a.sh 内容是 pwd,你会发现,显示的是执行命令的路径 /home/june,并不是 a.sh 所在路径:/home/june/shell/a.sh

二、文件路径

这个$0有可能是好几种值,跟调用的方式有关系:

  • 使用一个文件调用bash,那$0的值,是那个文件的名字(没说是绝对路径噢)
  • 使用-c选项启动bash的话,真正执行的命令会从一个字符串中读取,字符串后面如果还有别的参数的话,使用从$0开始的特殊变量引用(跟路径无关了)
  • 除此以外,$0会被设置成调用bash的那个文件的名字(没说是绝对路径)

具体例子:

Jun@VAIO 192.168.1.216 23:52:54 ~ >
cat shell/a.sh
#!/bin/bash
echo '$0: '$0
echo "pwd: "`pwd`
echo "============================="
echo "scriptPath1: "$(cd `dirname $0`; pwd)
echo "scriptPath2: "$(pwd)
echo "scriptPath3: "$(dirname $(readlink -f $0))
echo "scriptPath4: "$(cd $(dirname ${BASH_SOURCE:-$0});pwd)
echo -n "scriptPath5: " && dirname $(readlink -f ${BASH_SOURCE[0]})
Jun@VAIO 192.168.1.216 23:53:17 ~ >
bash shell/a.sh
$0: shell/a.sh
pwd: /home/Jun
=============================
scriptPath1: /home/Jun/shell
scriptPath2: /home/Jun
scriptPath3: /home/Jun/shell
scriptPath4: /home/Jun/shell
scriptPath5: /home/Jun/shell
Jun@VAIO 192.168.1.216 23:54:54 ~ >

如何获得绝对路径呢?

直接从dirname返回的未必是绝对路径,取决于提供给dirname的参数是否是绝对路径。 所以下面这样的代码中SHELL_FOLDER中不一定是绝对路径

SHELL_FOLDER=$(dirname "$0")

需要用cd和pwd命令配合获取脚本所在绝对路径,正确的写法是这样的,

SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)

所以用readlink命令我们可以直接获取$0参数的全路径文件名,然后再用dirname获取其所在的绝对路径:

SHELL_FOLDER=$(dirname $(readlink -f "$0"))

三、总结

dirname $0,取得当前执行的脚本文件的父目录
cd `dirname $0`,进入这个目录(切换当前工作目录)
pwd,显示当前工作目录(cd执行后的)
由此,我们获得了当前正在执行的脚本的存放路径。

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn