切换或得到shell脚本文件所在目录的完整路径(绝对路径)
$( dirname “$0“ ) 不推荐使用
demo:
SCRIPT_PATH="$( cd "$( dirname "$0" )" >/dev/null 2>&1 && pwd )"
cd "$SCRIPT_PATH/.." || exit
在linux中,dirname命令可以返回文件所在的目录。$0表示Shell本身的文件名。
因此此写法的作用为:
这个语句的作用是获取shell脚本所在目录的绝对路径,然后切换到 脚本 所在的目录。
这个脚本是有缺陷的,例如:脚本A source 了另一个⽬目录下的脚本B, 然后脚本B尝试使⽤用此法获取路路径时得到的是A的路路径
脚本中引用脚本推荐使用 ${BASH_SOURCE[0]
dirname
dirname的功能是去掉文件路径名中的从右往左数的第一个/及其之后的所有文字,查看dirname的help信息可以看到如下的例子
[root@dev workspace]# dirname --help
Usage: dirname [OPTION] NAME...
Output each NAME with its last non-slash component and trailing slashes
removed; if NAME contains no /'s, output '.' (meaning the current directory).
-z, --zero end each output line with NUL, not newline
--help display this help and exit
--version output version information and exit
Examples:
dirname /usr/bin/ -> "/usr"
dirname dir1/str dir2/str -> "dir1" followed by "dir2"
dirname stdio.h -> "."
GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Full documentation at: <https://www.gnu.org/software/coreutils/dirname>
or available locally via: info '(coreutils) dirname invocation'
[root@dev workspace]#
"."表示当前路径
SCRIPT_PATH="$( cd "$( dirname "$0" )" >/dev/null 2>&1 && pwd )"
结合上面基础,此时$(dirname $0)
的结果就是.
,那么cd $(dirname $0)就是cd .
,之后运行pwd
,此时获得的就是脚本所在的绝对路径了。
注意:dirname获取的是去掉文件路径名中的从右往左数的第一个/及其之后的所有文字。 我们在使用时,和我们调脚本的方式息息相关,我们使用绝对路径直接调脚本,还是进入第特定目录,再调脚本显示结果很大不一样。
工作中,我们有时候直接全路径调某个脚本没有问题,进入到脚本所在目录调反而出现问题,就要注意检查这里。 可能我们的脚本里面引用了dirname获取的路径,但是由于我们的调用方式不一样,获取的路径就不一样。我们别写shell脚本时,可能很多地方用到了这个路径。
$() 和 ${}
-
在 bash shell 中, ( ) 是将括号内命令的执行结果赋值给变量。用 ()是将括号内命令的执行结果赋值给变量。 用 ()是将括号内命令的执行结果赋值给变量。用( )的理由:
- 在多层次的复合替换中,
$( )的不足 - ``基本上可在全部的unix shell中使用,若写成shell script移植性比较高。而$( )并不是每一种shell都能使用。
-
是用来作变量替换。一般情况下, {} 是用来作变量替换。一般情况下, 是用来作变量替换。一般情况下,var 与 ${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围
示例如下:
[root@dev workspace]# A=B
[root@dev workspace]# echo $AB
[root@dev workspace]# echo ${A}B
BB
[root@dev workspace]#
${BASH_SOURCE[0] 推荐使用
我们可以在bash中使用以下命令获取所执行脚本文件的绝对路径:
#!/bin/bash
DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" && pwd);
echo $DIR
- BASH_SOURCE[0] - 等价于 BASH_SOURCE ,取得当前执行的 shell 文件所在的路径及文件名
- dirname - 去除文件名中的非目录部分,仅显示与目录有关的部分
- $() - 相当于
command
, 即获取command命令的结果 - && - 逻辑运算符号,只有当&&左边运行成功时才会运行&&右边的命令
${BASH_SOURCE[0]}
表示bash脚本的第一个参数(如果第一个参数是bash,表明这是要执行bash脚本,这时"${BASH_SOURCE[0]}"自动转换为第二个参数
通过上面示例,得到shell脚本文件所在完整路径(绝对路径)及文件名(无论source,sh,.三种调用方式),且不改变shell的当前目录。
亲测,好用!