3

好的,所以我在 Linux Ubuntu 中编写了一个 .sh 文件,它运行良好。但是,在 Mac 上,即使文件位于同一目录中,它也总是返回未找到该文件。谁能帮我吗?

.sh 文件:

if [ ! -f file-3*.jar ]; then
echo "[INFO] jar could not be found."
exit
fi

只是想我要补充一下,这不是一个以上的文件,而是一个重命名为多个结尾的文件。

4

4 回答 4

1

在对@Paul R 的回答的评论中,您说“shell 脚本也与 jar 文件位于同一目录中。因此,他们可以在指定 SH 文件默认情况下使用终端打开后双击它。” 我怀疑这是问题所在——当您通过双击运行 shell 脚本时,它运行的工作目录设置为用户的主目录,而不是脚本所在的目录。您可以通过将脚本 cd 放到它所在的目录来解决此问题:

cd "$(dirname "$BASH_SOURCE")"

编辑:当然,$BASH_SOURCE 是其他 shell 中不可用的 bash 扩展。如果您的脚本不能指望在 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

请注意,如果有多个匹配项,这将失败(即,就像文件不存在一样)。

于 2012-06-07T19:42:58.167 回答
0

我认为问题出在其他地方,因为脚本在 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
$

也许您的脚本在错误的外壳下运行,或者在错误的工作目录中?

于 2012-06-07T17:04:47.187 回答
0

不是它不适合你,它不适合你的用户吗?多年来,OS X 的默认 shell 已经发生了变化(参见这篇文章)——但看起来你的评论说你已经准备#!好了。

您确定您的用户将 JAR 文件放在正确的位置吗?也许不是脚本错误,而是它告诉您正确答案 - 运行脚本的位置缺少所需的文件。

于 2012-06-07T17:22:17.990 回答
0

这与其说是一个答案,不如说是一种策略:考虑一些严肃的日志记录。将消息回显到屏幕和日志文件,然后添加额外的日志记录,"[INFO] jar could not be found."例如 和 的值到日志中。然后,当您的客户/同事尝试运行脚本但失败时,他们可以通过电子邮件将日志发送给您。$PWD$SHELL$0

我可能会使用类似的东西

screenlog() {
    echo "$*"
    echo "$*" >> $LOGFILE
}

log() {
    echo "$*" >> $LOGFILE
}

$LOGFILE在脚本顶部定义。然后在你的脚本中加入screenlog "[INFO] jar could not be found."or之类的语句log "\$PWD: $PWD"

于 2012-06-07T23:06:39.427 回答