填坑:shell腳本里的路徑問題

上一篇文章里提到運行shell腳本時,一些命令或文件可能找不到,比如 Java(這里也是一個坑,我不知道為什么 cron 運行時沒找到我的 jdk 路徑,可能與我java的配置有關(guān))

1. 實驗:用(軟/硬)鏈接進行嘗試

實驗結(jié)果:失敗

原因很簡單,無論是軟鏈接還是硬鏈接,$PWD 還是鏈接所在的目錄

2. 借鑒android studio的啟動腳本寫法

android-studio/bin/studio.sh

.....
......
..........
READLINK=`which readlink`
DIRNAME=`which dirname`
..........
.........
# ---------------------------------------------------------------------
# Ensure IDE_HOME points to the directory where the IDE is installed.
# ---------------------------------------------------------------------
SCRIPT_LOCATION=$0
if [ -x "$READLINK" ]; then
  while [ -L "$SCRIPT_LOCATION" ]; do
    SCRIPT_LOCATION=`"$READLINK" -e "$SCRIPT_LOCATION"`
  done
fi

IDE_HOME=`dirname "$SCRIPT_LOCATION"`/..
IDE_BIN_HOME=`dirname "$SCRIPT_LOCATION"`
  • which 命令, 用來查詢命令的絕對路徑
  • $0 當(dāng)前程序或腳本的名稱(如果有路徑則包含路徑,如 ./temp/test.sh testFile 的 $0 就是 ./temp/test.sh )
  • readlink -e
readlink - print resolved symbolic links or canonical file names
 -e, --canonicalize-existing
              canonicalize by following every symlink in every component of the given name recursively, all components must exist

大致意思就是遞歸讀取鏈接指向的目標(biāo)

  • [ ] -x : 查看是否可執(zhí)行 -L : 是否是鏈接文件
  • dirname 不好解釋,man手冊如下
EXAMPLES
       dirname /usr/bin/
              -> "/usr"

       dirname dir1/str dir2/str
              -> "dir1" followed by "dir2"

       dirname stdio.h
              -> "."

應(yīng)該只是解析字符串,并不會檢查文件是否存在,而且可以得到相對路徑

3. 對上篇文章中的腳本進行改寫

#!/bin/bash
READLINK=`which readlink`

ScriptPath=$0
if [ -x "$READLINK" ]; then
  while [ -L "$ScriptPath" ]; do
    ScriptPath=`"$READLINK" -e "$ScriptPath"`
  done
fi

tempXMLFile="$ScriptPath/temp.xml"
logFile="$ScriptPath/log"
tempFile="$ScriptPath/temp"
jarFile="$ScriptPath/Untitled.jar"

date >> $logFile
curl "http://store.steampowered.com/app/730/CounterStrike_Global_Offensive/" > $tempXMLFile
echo "curl result = $?" >> $logFile
~/Java/jdk1.7.0_45/bin/java -jar $jarFile $tempXMLFile > $tempFile
cat $tempFile >> $logFile
echo >> $logFile
cat $tempFile | heirloom-mailx -s "CS:GO today's price" xxxxxx@xxxx

java 命令這邊還是無法解決,繼續(xù)留坑


java失敗原因,參考文章Linux中crontab的坑爹環(huán)境變量問題


在腳本里 /usr/bin/env 的輸出結(jié)果

SHELL=/bin/sh
PATH=/usr/bin:/bin
PWD=/home/(當(dāng)前用戶名)
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/(當(dāng)前用戶名)
LANGUAGE=en_US:
LOGNAME=(當(dāng)前用戶名)
_=/usr/bin/env
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容