好的,我已经在Linux Ubuntu中编写了一个.sh文件,它运行得非常完美。然而,在Mac上,即使它在同一目录下,它总是返回文件未找到的错误。有人能帮我解决吗?
.sh文件:
if [ ! -f file-3*.jar ]; then
echo "[INFO] jar could not be found."
exit
fi
我想补充一下,这不是针对多个文件的,而是针对一个文件改名为多个结尾。
cd "$(dirname "$BASH_SOURCE")"
编辑:$BASH_SOURCE 当然是bash扩展,不适用于其他shell。如果您的脚本不能保证在bash中运行,请改用以下方法:
case "$0" in
*/*)
cd "$(dirname "$0")" ;;
*)
me="$(which "$0")"
if [ -n "$me" ]; then
cd "$(dirname "$me")"
else
echo "Can't locate script directory" >&2
exit 1
fi ;;
esac
顺便说一下,构造函数[ ! -f file-3*.jar ]
让我感到有些紧张,因为如果有多个匹配的文件,它会出现奇怪的错误。 (我知道,这不应该发生; 但是那些不应该发生的事情总是有令人烦恼的倾向发生。)我会使用这个代替:
matchfiles=(file-3*.jar)
if [ ! -f "${matchfiles[0]}" ]; then
...
如果您无法依赖于Bash扩展,这里有一个替代方案,可以在任何POSIX shell中使用:
if [ ! -f "$(echo file-3*.jar)" ]; then
不是因为它不能为你工作,而是不能为你的用户工作吗?多年来,OS X 的默认 shell 已经发生了变化(参见this post) - 但是看起来你的评论说你已经放置了 #!
。
你确定你的用户将 JAR 文件放在了正确的位置吗?也许脚本不是错的,而是在告诉你正确的答案 - 脚本所在的位置缺少必需的文件。
我认为问题在别处,因为脚本在 Mac OS X 上按预期工作:
$ if [ ! -f file-3*.jar ]; then echo "[INFO] jar could not be found."; fi
[INFO] jar could not be found.
$ touch file-302.jar
$ if [ ! -f file-3*.jar ]; then echo "[INFO] jar could not be found."; fi
$
也许你的脚本正在错误的shell下运行,或者在错误的工作目录下运行?
这不是一个答案,而是一种策略:考虑进行严格的日志记录。将诸如"[INFO] jar could not be found."
之类的回显消息同时输出到屏幕和日志文件中,然后添加额外的日志记录,例如$PWD
、$SHELL
和$0
的值。这样,当您的客户/同事尝试运行脚本并失败时,他们可以将日志发送给您。
我可能会使用类似于以下的东西:
screenlog() {
echo "$*"
echo "$*" >> $LOGFILE
}
log() {
echo "$*" >> $LOGFILE
}
$LOGFILE
。然后在你的脚本中添加类似screenlog "[INFO] jar could not be found."
或 log "\$PWD: $PWD"
的语句。
ls file-3*.jar
的输出吗? - larsks