文档章节

shell获取当前工作目录绝对路径

yzbty23
 yzbty23
发布于 2015/10/14 22:06
字数 831
阅读 1405
收藏 0

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

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

简单介绍一下获取方法如下:

#!/bin/bashthis_dir=`pwd`echo "$this_dir ,this is pwd"echo "$0 ,this is \$0"dirname $0|grep "^/" >/dev/nullif [ $? -eq 0 ];then
    this_dir=`dirname $0`else
    dirname $0|grep "^\." >/dev/null
     retval=$?if [ $retval -eq 0 ];then
    this_dir=`dirname $0|sed "s#^.#$this_dir#"`else
    this_dir=`dirname $0|sed "s#^#$this_dir/#"`fi
 fi
 echo $this_dir

总结一下其实就是一条命令:

base_dir=$(cd "$(dirname "$0")";pwd)
dirname 
$0
,取得当前执行的脚本文件的父目录
cd 
dirname $0
,进入这个目录(切换当前工作目录)
pwd,显示当前工作目录(cd执行后的)


我今天遇到一个问题就是:

需要压缩备份一个目录下的所有的文件,其实代码就2行:

我还是贴全部的吧,最后2行是我的:

#!/bin/bash
this_dir=`pwd`
echo "$this_dir ,this is pwd"
echo "$0 ,this is \$0"
dirname $0|grep "^/" >/dev/null
if [ $? -eq 0 ];then
    this_dir=`dirname $0`
else
    dirname $0|grep "^\." >/dev/null
     retval=$?
if [ $retval -eq 0 ];then
    this_dir=`dirname $0|sed "s#^.#$this_dir#"`
else
    this_dir=`dirname $0|sed "s#^#$this_dir/#"`
fi
 fi
 echo $this_dir
date=`date +%Y%m%d%H%M` 
tar -czvf /root/test/FTP_DATA_$date.tar.gz /FTP_DATA

如上,如果不加上边的,当你执行shell脚本的时候,会报找不到文件,加上之后就好了,大家一起讨论学习

© 著作权归作者所有

共有 人打赏支持
yzbty23
粉丝 119
博文 260
码字总数 224023
作品 0
浦东
程序员
私信 提问
bash shell 获取当前正在执行脚本的绝对路径

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

大数据之路
2013/08/07
0
3
.net 当前工作目录VS当前执行目录与shell

定义: 当前工作目录——进行某项操作的目的目录,会随着OpenFileDialog、SaveFileDialog等对象所确定的目录而改变。 当前执行目录——该进程从中启动的目录,即文件自身所在目录。工作目录与...

LMcallme
2013/04/10
0
0
python_os_sys学习笔记

sys sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的...

知止内明
2018/07/09
0
0
Bash如何取得当前正在执行的脚本的绝对路径?

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

bobwei
2015/12/08
37
0
linux学习——文件系统结构

简介 1.Linux是一个单根倒转的树状结构。 2.文件系统的根为“/”(顶级目录)。 3.文件系统严格区分大小写,而window不作区分。 4.路径使用“/”做区分(而在window中用“”做区分) 5.几乎所...

十年磨一剑3344
2018/02/07
3
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
9
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
3
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
5
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部