文档章节

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

yzbty23
 yzbty23
发布于 2015/10/14 22:06
字数 831
阅读 1156
收藏 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
粉丝 118
博文 251
码字总数 216816
作品 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 返回模块的...

知止内明
07/09
0
0
linux学习——文件系统结构

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

十年磨一剑3344
02/07
3
0
Bash如何取得当前正在执行的脚本的绝对路径?

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

bobwei
2015/12/08
37
0

没有更多内容

加载失败,请刷新页面

加载更多

【转载】Linux升级安装GCC

https://itbilu.com/linux/management/V1vdnt9ll.html

goodman_fz
12分钟前
0
0
20.20 告警系统主脚本~20.22 告警系统监控项目

告警系统主脚本 main.sh内容 #!/bin/bash#Written by aming.# 是否发送邮件的开关export send=1# 过滤ip地址export addr=`/sbin/ifconfig |grep -A1 "ens33: "|awk '/inet/ {...

洗香香
15分钟前
0
0
07-利用思维导图梳理JavaSE-包与访问控制权限

07-利用思维导图梳理JavaSE-包与访问控制权限 主要内容 1.包的概念及使用 1.1.包的概念 1.2.包的作用 1.3.需要注意的问题 1.4.包的引用 2.系统常见包 2.1.java.lang包 2.2.java.io包 2.3.ja...

飞鱼说编程
16分钟前
0
0
【挑战剑指offer】系列02:替换空格

本系列的算法原题来自于“牛客网-剑指offer”,写这个板块,不仅仅是解决算法问题本身,更是手动提高难度、自行变式,思考更多的解决方案,以带给自己一些启发。 1. 【替换空格】原始题目 算...

LinkedBear
31分钟前
0
0
Win10内部更新:警告用户别用chrome和Firefox

简评:别和 Chrome 和 Firefox 约行不,我 Edge 明明更美、屁股更翘、更性感。。。 微软正在测试 Windows 10 的一个更新:警告用户不要安装 Chrome 和 Firefox。是测试人员发现的这个新警告,...

极光推送
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部