Linux Shell编程之softlink invoke与工作目录问题

简介:

softlink 又叫做symbolic link,相当于一种”快捷方式”,由ln –s sourcefile distinctionfile (ln –s TARGET LINK_NAME)创建,连接文件的存在使得简化了文件系统,用户操作起来更加方便。但在Shell编程中却是一个需要非常注意的点,因为工作目录(Work Directory)的原因,Shell需要使用“标准”的变量(跟系统环境变量有些类似)来定位它当前的工作目录以及这些目录中的文件,假如工作目录定义出了错,那Shell脚本预计很难运行正确。例如Shell脚本中使用了$(pwd)或者其他相对的路径而不是绝对路径,那不出错就奇怪了!因为softlink的存在会导致一些编写不好的Shell脚本在以softlink的方式引用或者执行时就会出现大问题,为了避免这个问题,就需要将softlink解析成真正的文件,或者获取真正的工作目录。

解决方式如下(参考tomcat的catalina.sh脚本):

1
2
3
4
5
6
7
8
9
10
11
12
# resolve links - $0 may be a softlink - stolen from catalina.sh    
PRG= "$0"     
while  [ -h  "$PRG"  ];  do     
   ls =` ls  -ld  "$PRG" `     
   link=` expr  "$ls"  '.*-> \(.*\)$' `     
   if  expr  "$link"  '/.*'  /dev/null then     
     PRG= "$link"     
   else     
     PRG=` dirname  "$PRG" `/ "$link"     
   fi     
done     
PRGDIR=` dirname  "$PRG" `

   

经过以上处理,就可以将工作目录(Work Directory)设定成PRGDIR,从而解决工作目录的问题,应用举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash    
# resolve links - $0 may be a softlink     
PRG= "$0"
while  [ -h  "$PRG"  ];  do    
   ls =` ls  -ld  "$PRG" `     
   link=` expr  "$ls"  '.*-> \(.*\)$' `     
   if  expr  "$link"  '/.*'  /dev/null then     
     PRG= "$link"     
   else     
     PRG=` dirname  "$PRG" `/ "$link"     
   fi     
done
# Get standard environment variables    
PRGDIR=` dirname  "$PRG" `
# Public header    
WORKDIR=$PRGDIR     
# Where to get source code     
SOURCEURL=     
# end public header     
# -Public header
function  deploy() {

--end--



softlink 又叫做symbolic link,相当于一种”快捷方式”,由ln –s sourcefile distinctionfile (ln –s TARGET LINK_NAME)创建,连接文件的存在使得简化了文件系统,用户操作起来更加方便。但在Shell编程中却是一个需要非常注意的点,因为工作目录(Work Directory)的原因,Shell需要使用“标准”的变量(跟系统环境变量有些类似)来定位它当前的工作目录以及这些目录中的文件,假如工作目录定义出了错,那Shell脚本预计很难运行正确。例如Shell脚本中使用了$(pwd)或者其他相对的路径而不是绝对路径,那不出错就奇怪了!因为softlink的存在会导致一些编写不好的Shell脚本在以softlink的方式引用或者执行时就会出现大问题,为了避免这个问题,就需要将softlink解析成真正的文件,或者获取真正的工作目录。

解决方式如下(参考tomcat的catalina.sh脚本):

1
2
3
4
5
6
7
8
9
10
11
12
# resolve links - $0 may be a softlink - stolen from catalina.sh    
PRG= "$0"     
while  [ -h  "$PRG"  ];  do     
   ls =` ls  -ld  "$PRG" `     
   link=` expr  "$ls"  '.*-> \(.*\)$' `     
   if  expr  "$link"  '/.*'  /dev/null then     
     PRG= "$link"     
   else     
     PRG=` dirname  "$PRG" `/ "$link"     
   fi     
done     
PRGDIR=` dirname  "$PRG" `

   

经过以上处理,就可以将工作目录(Work Directory)设定成PRGDIR,从而解决工作目录的问题,应用举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash    
# resolve links - $0 may be a softlink     
PRG= "$0"
while  [ -h  "$PRG"  ];  do    
   ls =` ls  -ld  "$PRG" `     
   link=` expr  "$ls"  '.*-> \(.*\)$' `     
   if  expr  "$link"  '/.*'  /dev/null then     
     PRG= "$link"     
   else     
     PRG=` dirname  "$PRG" `/ "$link"     
   fi     
done
# Get standard environment variables    
PRGDIR=` dirname  "$PRG" `
# Public header    
WORKDIR=$PRGDIR     
# Where to get source code     
SOURCEURL=     
# end public header     
# -Public header
function  deploy() {

--end--







本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1676488,如需转载请自行联系原作者


相关文章
|
2天前
|
网络协议 Shell Linux
LabVIEW 在NI Linux实时设备上访问Shell
LabVIEW 在NI Linux实时设备上访问Shell
|
3天前
|
Linux Shell
Linux操作系统下查找大文件或目录的技巧
Linux操作系统下查找大文件或目录的技巧
10 2
|
3天前
|
域名解析 Unix Linux
AIX上如何正确挂载Linux 的nfs共享目录分享篇
AIX上如何正确挂载Linux 的nfs共享目录分享篇
|
4天前
|
Shell Linux
【Linux】进程实践项目(更新中) — 自主shell编写
前几篇文章,我们学习进程的相关知识:进程概念,进程替换,进程控制。熟悉了进程到底是个什么事情,接下来我们来做一个实践,来运用我们所学的相关知识。这个项目就是手搓一个shell模块,模拟实现Xshell中的命令行输入。
10 1
|
4天前
|
监控 关系型数据库 Shell
Shell脚本入门:从基础到实践,轻松掌握Shell编程
Shell脚本入门:从基础到实践,轻松掌握Shell编程
|
4天前
|
Linux
在 Linux 中复制文件和目录
在 Linux 中复制文件和目录
|
4天前
|
Linux Shell C++
Linux 终端中的目录切换
Linux 终端中的目录切换
|
4天前
|
Shell Linux 信息无障碍
5 个有用的 Linux Shell 转义序列
5 个有用的 Linux Shell 转义序列
|
7月前
|
Unix Shell Linux
|
2月前
|
Shell Linux C语言
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
35 0