shell 获取正在执行脚本的绝对路径

今天在写脚本的时候,想获取下当前执行脚本的绝对路径,试了试pwd,发现并不是正确的路径。找资料后发现 pwd 命令的作用是“print name of current/working directory-当前的工作目录”。 试了试$0,发现也不对,$0是Bash环境下的特殊变量,其真实含义是:

  Expands to the name of the shell or shell script. This is set at shell initialization. If bash is invoked with a file of commands, $0 is set to the name of that file. If bash is started with the -c option, then $0 is set to the first argument after the string to be executed, if one is present. Otherwise, it is set to the file name used to invoke bash, as given by argument zero.

$0的结果与调用方式有关:

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

正确的姿势:

basepath=$(cd dirname $0; pwd)

  • dirname $0,取得当前执行的脚本文件的父目录
  • cd dirname $0,进入这个目录(切换当前工作目录)
  • pwd,显示当前工作目录(cd执行后的)