Mac脚本文件存在问题

时间:2012-06-07 16:54:57

标签: macos file shell

好的,所以我在Linux Ubuntu中编写了一个.sh文件,它运行得很好。但是在Mac上,它始终返回即使文件位于同一目录中也找不到该文件。任何人都可以帮助我吗?

.sh文件:

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

只是想我添加,这不是一个文件,而是一个重命名为多个文件的文件。

4 个答案:

答案 0 :(得分: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

请注意,如果有多个匹配,这将失败(即表现为文件不存在)。

答案 1 :(得分: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
$

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

答案 2 :(得分:0)

并不是说它不适合你,它对你的用户不起作用? OS X的默认shell多年来发生了变化(请参阅this post) - 但您的评论似乎表明您已#!了。

您确定您的用户在正确的位置拥有JAR文件吗?也许这不是脚本错误,因为它告诉你正确的答案 - 脚本运行的地方缺少所需的文件。

答案 3 :(得分: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."log "\$PWD: $PWD"等语句为您的脚本添加胡椒。