上一篇文章里提到运行shell脚本时,一些命令或文件可能找不到,比如 Java(这里也是一个坑,我不知道为什么 cron 运行时没找到我的 jdk 路径,可能与我java的配置有关)
1. 实验:用(软/硬)链接进行尝试
实验结果:失败
原因很简单,无论是软链接还是硬链接,$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 当前程序或脚本的名称(如果有路径则包含路径,如 ./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
大致意思就是递归读取链接指向的目标
- [ ] -x : 查看是否可执行 -L : 是否是链接文件
- dirname 不好解释,man手册如下
EXAMPLES
dirname /usr/bin/
-> "/usr"
dirname dir1/str dir2/str
-> "dir1" followed by "dir2"
dirname stdio.h
-> "."
应该只是解析字符串,并不会检查文件是否存在,而且可以得到相对路径
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 命令这边还是无法解决,继续留坑
java失败原因,参考文章Linux中crontab的坑爹环境变量问题
在脚本里 /usr/bin/env 的输出结果
SHELL=/bin/sh
PATH=/usr/bin:/bin
PWD=/home/(当前用户名)
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/(当前用户名)
LANGUAGE=en_US:
LOGNAME=(当前用户名)
_=/usr/bin/env