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腳本):tomcat

# 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,從而解決工做目錄的問題,應用舉例:bash

#!/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--ide

相關文章
相關標籤/搜索