上一篇文章里提到運行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