[转载]有些shell文件中为啥要用$(cd “$(dirname $0)“; pwd),pwd它不香吗
$(cd "$(dirname "$0")",pwd) 解析
xx.sh 文件内容如下:

#!/bin/bash
BIN_FOLDER=$(cd "$(dirname "$0")";pwd)
echo $BIN_FOLDER
PROJECT_FOLDER=$(cd "$(dirname "$BIN_FOLDER")";pwd)
echo $PROJECT_FOLDER
PYTHON_BIN=$PROJECT_FOLDER/.venv/bin/python
echo $PYTHON_BIN

BIN_FOLDER = $(cd "$(dirname "$0")",pwd) 解析:
1、取当前运行脚本的所在路径: $0
2、取当前脚本所在路径的父目录: dirname "$0"
3、取返回的父目录的值: $(dirname "$0")
4、cd到返回的父目录: cd "$(dirname "$0")"
5、输出地址: cd "$(dirname "$0")",pwd
6、取输出的地址,并赋值给BIN_FOLDER: BIN_
有些shell文件中为啥要用$(cd “$(dirname $0)“; pwd),pwd它不香吗
1.dirname
输入
dirname是一种shell命令,参数只能有一个,可以是任意字符串(";"除外),这里要注意,dirname不会检查参数是不是文件或目录。比如:
[root@xx /]# dirname .;
[root@xx /]# dirname !;
[root@xx /]# dirname c.txt;
[root@xx /]# dirname a/b/c.txt;
[root@xx /]# dirname a/b/c;
[root@xx /]# dirname a/b/c/;
[root@xx /]# dirname a/b/c/ ;
[root@xx /]# dirname a/b/c/.;
[root@xx /]# dirname a/b/c\\d;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
输出
感受一下
[root@xx /]# .
[root@xx /]# .
[root@xx /]# .
[root@xx /]# a/b
[root@xx /]# a/b
[root@xx /]# a/b
[root@xx /]# a/b
[root@xx /]# a/b/c
[root@xx /]# a/b
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
特点
我猜dirname处理输入的字符串(";“作为命令截止符不会处理)时,是从字符串的末尾往前处理,并将末尾到第一个”/“之间的所有字符(包括”/“字符)全部删除,然后返回剩余的字符;如果没有遇到”/“字符,那就返回”."。
2.pwd
输入
pwd是不需要任何参数的,但如果非要加上参数也是能执行的,但参数会表示自己没有任何存在感,如:
[root@xx /]# pwd
[root@xx /]# pwd a
[root@xx /]# pwd a b
- 1
- 2
- 3
输出
感受一下
[root@xx /]# /
[root@xx /]# /
[root@xx /]# /
- 1
- 2
- 3
特点
特点就是简单,返回当前目录或者工作目录的绝对路径。这里有个需要注意的地方,假设目录/home/a/b/c下有个c.sh脚本,里面实现的是打印pwd命令的结果,而/home/a/b下有个b.sh脚本,里面实现的是调用c.sh脚本,那么打印的结果是/home/a/b
3.总结
在脚本文件中,pwd直接获取当前脚本文件对应的绝对路径时是有风险的,因为当其他脚本文件调用你时,pwd就不是你所在的绝对目录了,所以我们的$(cd “$(dirname $0)”; pwd)就应运而生啦!
[转载]有些shell文件中为啥要用$(cd “$(dirname $0)“; pwd),pwd它不香吗的更多相关文章
- [转载]MyBatis mapper文件中的变量引用方式#{}与${}的差别
转载自:http://blog.csdn.net/szwangdf/article/details/26714603 默认情况下,使用#{}语法,MyBatis会产生PreparedStatement ...
- shell 文件中列的整合成一个文件
原文件 第一种方法 [root@wxb- jt]# paste -d "," b c d ,q, , ,e, ,r, ,t, [root@wxb- jt]# paste b c d ...
- shell 文件中添加内容
下文所有 1111 , 2222 均为字符串 sed -i '/1111/i\2222' a.txt 在a.txt中找到所有符合1111得 前面加上2222 sed -i '/1111/a\2 ...
- linux shell文件合并 去重 分割
1,合并+去重+分割 转载:shell 文件合并,去重,分割 - kakaisgood - 博客园 (cnblogs.com) 第一:两个文件的交集,并集前提条件:每个文件中不得有重复行1. 取出两个 ...
- web.xml文件中的web-app元素 部署
[转载]web.xml文件中的web-app元素 (2012-05-24 13:35:57) 转载▼ 标签: 转载 分类: java 挺全 的 呵呵呵 转了 原文地址:web.xml文件中的web-a ...
- Linux操作系统中文件结构stat中st_size的说明以及对于文件中洞(Holes)的理解
文件stat结构体中st_size成员 对于所有的文件类型,st_size成员对其中的普通文件.目录以及符号链接有实在的意义.其中,对于普通文件而言,st_size记录了该文件的实际大小:对于目录而言 ...
- Scala快速统计文件中特定单词,字符的个数
val fileContent=Source.fromFile("/home/soyo/桌面/ss5.txt").getLines.mkString(",") ...
- 如何优雅地将printf的打印保存在文件中?
我们都知道,一般使用printf的打印都会直接打印在终端,如果想要保存在文件里呢?我想你可能想到的是重定向.例如: $ program > result.txt 这样printf的输出就存储在r ...
- [Shell学习笔记] read命令从键盘或文件中获取标准输入(转载)
转自:http://www.1987.name/151.html read命令是用于从终端或者文件中读取输入的内部命令,read命令读取整行输入,每行末尾的换行符不被读入.在read命令后面,如果没有 ...
随机推荐
- LamPiao靶机work_through
前言 oscp靶机系列的第二篇.只追求做出来的话,这靶机蛮简单的.但是为了提升难度,尽量避免使用msf--毕竟考试只准用一次嘛,自己写了个exp. 正文 主机发现 nmap -sP 192.168.2 ...
- [图论]最优布线问题:kruskal
最优布线问题 目录 最优布线问题 Description Input Output Sample Input Sample Output Hint 解析 代码 Description 学校有n台计算机 ...
- 翻译:《实用的Python编程》07_04_Function_decorators
目录 | 上一节 (7.3 返回函数) | 下一节 (7.5 装饰方法) 7.4 函数装饰器 本节介绍装饰器(decorator).因为这是一个高级主题,所以我们只做简单介绍. 译注:根据译者个人的猜 ...
- 【Android实习】20场面试斩获大厂offer,我学会了什么
前言 很高兴遇见你~ 先说一下笔者春招实习的情况:从三月初到四月半,经历了近20场面试,一共面试了五家企业,通过了腾讯.字节.蚂蚁.美团的面试,虎牙在一面之后拒了二面邀请. 金三银四,笔者不是在面试中 ...
- Kubernetes查看可用的apiVersion版本
命令: kubectl api-versions
- 我最近做了一个react的后台管理系统,用于快速创建后台项目模板
react-ant-admin 此框架使用与二次开发,前端框架使用react,UI框架使用ant-design,全局数据状态管理使用redux,ajax使用库为axios.用于快速搭建中后台页面.欢迎 ...
- spring data jpa之Auditing 表的创建时间,更新时间自动生成策略
java实际编程中,几乎每一张表都会有createTime和updateTime字段,spring的优秀之处在于只要用几个注解,就帮我们解决该类问题,具体实现: 1,实体类添加注解: @EntityL ...
- Hive千亿级数据倾斜解决方案
数据倾斜问题剖析 数据倾斜是分布式系统不可避免的问题,任何分布式系统都有几率发生数据倾斜,但有些小伙伴在平时工作中感知不是很明显,这里要注意本篇文章的标题-"千亿级数据",为什么说 ...
- 1016 Phone Bills
A long-distance telephone company charges its customers by the following rules: Making a long-distan ...
- 1.1.09- 序列赋值 is , is not运算符
两个变量的交换算法 代码如下: a = 10000 b = 20000 temp = a a = b b = temp print(a) print(b) 序列赋值: a,b = b,aprint(a ...
43
收藏