好的,所以我在Linux Ubuntu中编写了一个.sh文件,它运行得很好。但是在Mac上,它始终返回即使文件位于同一目录中也找不到该文件。任何人都可以帮助我吗?
.sh文件:
if [ ! -f file-3*.jar ]; then
echo "[INFO] jar could not be found."
exit
fi
只是想我添加,这不是一个文件,而是一个重命名为多个文件的文件。
答案 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"
等语句为您的脚本添加胡椒。