文档章节

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

大数据之路
 大数据之路
发布于 2013/08/07 00:36
字数 666
阅读 26543
收藏 16
点赞 5
评论 3

如题,一般我们写Shell脚本的时候,都倾向使用绝对路径,这样无论脚本在什么目录执行,都应该起到相同的效果,但是有些时候,我们设计一个软件包中的工具脚本,可能使用相对路径更加灵活一点,因为你不知道用户会在哪个目录执行你的程序,就有了本文的题目。

  常见的一种误区,是使用 pwd 命令,该命令的作用是“print name of current/working directory”,这才是此命令的真实含义,当前的工作目录,这里没有任何意思说明,这个目录就是脚本存放的目录。所以,这是不对的。你可以试试 bash shell/a.sh,a.sh 内容是 pwd,你会发现,显示的是执行命令的路径 /home/june,并不是 a.sh 所在路径:/home/june/shell/a.sh

  另一个误人子弟的答案,是 $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的那个文件的名字(没说是绝对路径)

下面对比下正确答案:

Jun@VAIO 192.168.1.216 23:52:54 ~ >
cat shell/a.sh
#!/bin/bash
echo '$0: '$0
echo "pwd: "`pwd`
echo "============================="
echo "scriptPath1: "$(cd `dirname $0`; pwd)
echo "scriptPath2: "$(pwd)
echo "scriptPath3: "$(dirname $(readlink -f $0))
echo "scriptPath4: "$(cd $(dirname ${BASH_SOURCE:-$0});pwd)
echo -n "scriptPath5: " && dirname $(readlink -f ${BASH_SOURCE[0]})
Jun@VAIO 192.168.1.216 23:53:17 ~ >
bash shell/a.sh
$0: shell/a.sh
pwd: /home/Jun
=============================
scriptPath1: /home/Jun/shell
scriptPath2: /home/Jun
scriptPath3: /home/Jun/shell
scriptPath4: /home/Jun/shell
scriptPath5: /home/Jun/shell
Jun@VAIO 192.168.1.216 23:54:54 ~ >

在此解释下 scriptPath1 :

  • dirname $0,取得当前执行的脚本文件的父目录

  • cd `dirname $0`,进入这个目录(切换当前工作目录)

  • pwd,显示当前工作目录(cd执行后的)

  • 由此,我们获得了当前正在执行的脚本的存放路径。

本文转载自:http://blogread.cn/it/article/6549?f=wb

共有 人打赏支持
大数据之路
粉丝 1476
博文 501
码字总数 343984
作品 0
武汉
架构师
加载中

评论(3)

雁南飞丶
雁南飞丶
$PWD
whinc
whinc
很详细,赞一个~
junsun
junsun
echo `dirname $(readlink -f $0)`
shell获取当前工作目录绝对路径

一般我们写Shell脚本的时候,都倾向使用绝对路径,这样无论脚本在什么目录执行,都应该起到相同的效果,但是有些时候,我们设计一个软件包中的工具脚本或者远程调用某个脚本时,可能使用相对...

yzbty23 ⋅ 2015/10/14 ⋅ 0

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

如题,一般我们写Shell脚本的时候,都倾向使用绝对路径,这样无论脚本在什么目录执行,都应该起到相同的效果,但是有些时候,我们设计一个软件包中的工具脚本,可能使用相对路径更加灵活一点...

bobwei ⋅ 2015/12/08 ⋅ 0

笑谈区别之--执行Shell脚本的四种方法

执行shell脚本方式: 法一、绝对路径方式: 法二、相对路径方式: 法三、bash命令调用: 法四、". 2.sh"点空格相对路径 或者"./root/2.sh"点空格绝对路径方式: 说下几种方式的区别: 第一种和...

脑洞老湿_ ⋅ 01/29 ⋅ 0

Linux0基础深度解析shell简介01

一、shell简介 ------------ 用户 | 终端 (相当于bash的接口) | shell(壳) bash 大多数Linux系统默认的shell环境 | 内核 用户通过终端输入命令,提交给shell,再调用内核中的系统功能对命...

木玛by ⋅ 2017/11/17 ⋅ 0

新手Mac、Linux之脚本运行原理讲解

有很多人拿到一个脚本不知道如何运行,在这我就讲解一下关于脚本的基本知识。 先说一下一个比较规范的脚本应该是什么样子: 这是一个shell脚本。先不说这个脚本是干嘛用的什么功能,只说一下...

doctordc ⋅ 05/23 ⋅ 0

Linux shell基础和变量

0x00、shell shell是一个命令解释器,它为用户提供一个向linux内核发送请求以便运行程序的界面系统即程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。 硬件——内核——shell命...

wt7315 ⋅ 2016/10/08 ⋅ 0

小蚂蚁学习Linux(9)——shell基础了解和bash基本功能

shell简单了解 查看当前的shell echo $SHELL 尝试第一个小脚本: vim test.sh 1 #!/bin/bash 2 echo 'i will be back'; 注意: #!/bin/bash 这一句是一定要加的,切记。 执行脚本方式: 1. 赋...

嗜学如命的小蚂蚁 ⋅ 2015/11/04 ⋅ 0

shell编程基础

shell脚本是什么? 纯文本文档——文档中存储的数据都是以字符为单位进行存储的; 根据用户的需求来解决用户问题的大量命令组合体; “执行幂等性”——任何命令多次执行的结果是一致的; 很...

maoyu099236 ⋅ 2017/04/07 ⋅ 0

shell编程基础

shell脚本是什么? 纯文本文档——文档中存储的数据都是以字符为单位进行存储的; 根据用户的需求来解决用户问题的大量命令组合体; “执行幂等性”——任何命令多次执行的结果是一致的; 很...

maoyu099236 ⋅ 2017/04/07 ⋅ 0

Shell 函数 function [转]

本文也即《Learning the bash Shell》3rd Edition的第四章Basic Shell Programming之读书笔记,但我们将不限于此。 运行shell脚本程序   一个包含shell命令的脚本就是一个shell程序,例如....

zchd ⋅ 2013/11/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 26分钟前 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 45分钟前 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 59分钟前 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部