当我运行$PWD/filename.sh
时,它运行正常,但当我运行./filename.sh
时出现错误
could not find or load main class
任何人都可以解释为什么以及如何使其与./filename.sh
#!/bin/sh
# bash script here
SCRIPTDIR=`dirname $0`
Example_HOME=/opt/example/example
export CENTRASITE_HOME
. ${Example_HOME}/bin/example_setenv.sh
#set -xv
# -----------------------------------------------------------------------------
# extend PATH where to find executables
#
PATH=$PATH:$CENTRASITE_HOME/install
PATH=$PATH:$CENTRASITE_HOME/bin
export PATH
# extend the Java option settings
JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx512m"
export JAVA_OPTS
# -----------------------------------------------------------------------------
MY_HOME=$Example_HOME/bin/cfg
# -----------------------------------------------------------------------------
#
# add cfg directory to LD_LIBRARY_PATH etc.
#
#Solaris
LD_LIBRARY_PATH=${LD_LIBRARY_PATH:-}${LD_LIBRARY_PATH:+":"}$MY_HOME
export LD_LIBRARY_PATH
#HP-UX
SHLIB_PATH=${SHLIB_PATH:-}${SHLIB_PATH:+":"}$MY_HOME
export SHLIB_PATH
#AIX51
LIBPATH=${LIBPATH:-}${LIBPATH:+":"}$MY_HOME
export LIBPATH
# -----------------------------------------------------------------------------
#
# set CLASSPATH
#
RED=${Example_HOME}/red
CLASSPATH="$RED:$RED/*"
RT_PATH=${Example_HOME}/rt/bin
LOCAL_CLASSPATH="${SCRIPTDIR}/lib/*:${CENTRASITE_HOME}/lib/*:${RTS_PATH}/*:${REDIST}/*"
export CLASSPATH
#
### parameter handling
#
PROG=`basename $0`
ERROR=0
CLASS="main.com.example"
export CLASS`enter code here`
UI=${Example_HOME}/cast/
classpath=$CLASSPATH
localclasspath=$LOCAL_CLASSPATH
#
# Always change to an existing working directory to avoid Java error
WORKDIR=`pwd`
cd $CENTRASITE_HOME
EXECUTABLE="${CS_JAVA_EXE}"
EXECUTABLE="$EXECUTABLE ${JAVA_OPTS} -cp"
EXECUTABLE="$EXECUTABLE ${LOCAL_CLASSPATH} ${CLASS}"
# $EXECUTABLE "$@"
$EXECUTABLE "$UI $@"
#$EXECUTABLE "$UI $@"
RC=$?
#------------------------------------------------------------------------------
cd $WORKDIR
exit $RC
答案 0 :(得分:3)
问题在于:
SCRIPTDIR=`dirname $0`
当程序以$PWD
启动时,使用SCRIPTDIR
作为$PWD/filename.sh
,.
使用SCRIPTDIR
作为./filename.sh
。然后使用LOCAL_CLASSPATH
将$SCRIPTDIR
设置为其中一个目录。不幸的是,稍后该计划确实:
cd $CENTRASITE_HOME
这意味着使用绝对路径名,使用$SCRIPTDIR
仍然有效,但使用.
会完全打破$SCRIPTDIR
的位置。
您需要确定$SCRIPTDIR
的绝对路径名,而不管它是如何被调用的(没有路径的情况会很有趣)。
这些界限令人费解:
Example_HOME=/opt/example/example
export CENTRASITE_HOME
我们还有空间认为应该在两条线路上使用相同的名称;鉴于脚本的其余部分,Example_HOME
应该是CENTRASITE_HOME
,尽管两个名称都被广泛使用。
该行:
cd $WORKDIR
就在Unix之前没有意义(在DOS批处理命令文件中不在Windows上,但这不是DOS批处理命令文件)。除非您使用cd
或(在Bash中). filename.sh
,否则脚本中的source filename.sh
操作不会影响调用脚本的父进程。