填坑:shell脚本里的路径问题

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

你可能感兴趣的:(填坑:shell脚本里的路径问题)