linux shell 切换或得到shell脚本文件所在目录的完整路径(绝对路径)

您所在的位置:网站首页 shell打印当前路径 linux shell 切换或得到shell脚本文件所在目录的完整路径(绝对路径)

linux shell 切换或得到shell脚本文件所在目录的完整路径(绝对路径)

2023-07-29 19:26| 来源: 网络整理| 查看: 265

文章目录 切换或得到shell脚本文件所在目录的完整路径(绝对路径)$( dirname “$0“ ) 不推荐使用dirname$() 和 ${} ${BASH_SOURCE[0] 推荐使用

切换或得到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: Full documentation at: 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的当前目录。

亲测,好用!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3