前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何获取当前正在执行脚本的绝对路径

如何获取当前正在执行脚本的绝对路径

作者头像
小汪Waud
发布于 2023-02-03 06:58:52
发布于 2023-02-03 06:58:52
1.8K00
代码可运行
举报
文章被收录于专栏:小汪Waud小汪Waud
运行总次数:0
代码可运行

dirname $0

最近在看脚本的时候经常发现有“dirname $0”这样一种表述,很是不解。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# get path to scripts
scripts_dir=`dirname $0` 

刚开始我还以为需要把dirname改成对应的路径,同时又不解$0在这里是表达什么含义。

如图所示,dirname $0是不能在命令行下单独执行的。

举个例子,我用mkdir -p创建一系列文件夹

mkdir -p 1/2/3/4/5/6

然后写一个小脚本 test.sh

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
cd `dirname $0`
echo `pwd`

切到/home/zwang/1/2/3/4路径下,运行test.sh后就位于脚本所在的目录并输出路径了。

现在我们回头来把这个脚本拆开来理解一下

  • `` 表示执行引号内的命令
  • $0 表示当前执行脚本的文件名
  • dirname $0 表示获取当前执行脚本的路径

这样一来就能明白dirname $0是如何获取当前执行脚本的路径了吧?

$( ) 和 ``

在这里需要补充$( ) 和 ``的不同。

二者都是返回括号中命令的结果,是用来作命令替换的,即先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。

但需要注意两点:

  1. 在多层次的复合替换中,``必须要额外的跳脱处理(反斜线)
  2. 不是所有的类unix系统都支持$( ),但反引号是肯定支持的

举个栗子~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
basepath=$(cd `dirname $0`; pwd)
echo $basepath

此时输出的结果是脚本所在路径,但如果我换一种命令替换的方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
basepath=`cd `dirname $0`; pwd`
echo $basepath

出现了报错,这就需要按我上面提到的在多层次的复合替换中,``必须要额外的跳脱处理(反斜线),如果我按以下代码加上反斜线即可正常输出。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
basepath=`cd \`dirname $0\`; pwd`
echo $basepath

参考资料:

  1. https://blog.csdn.net/jackyechina/article/details/52813007
  2. http://sexywp.com/bash-how-to-get-the-basepath-of-current-running-script.htm
  3. https://blog.csdn.net/weixin_37766087/article/details/99974385
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小汪Waud 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • dirname $0
  • $( ) 和 ``
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档