如何让shell脚本在Linux和OS X上都能正常工作?
问题描述:
我有一段代码来编译一个tex文档。如何让shell脚本在Linux和OS X上都能正常工作?
#!/usr/bin/env bash
filename="thesis"
pdflatex -shell-escape $filename
makeglossaries $filename
bibtex $filename
pdflatex $filename
pdflatex $filename
# for Ubuntu
#xdg-open $filename.pdf
# for mac
open $filename.pdf
我该如何让这个脚本在Linux和OS X上都可以工作?我想应该是这样的,
if is Linux; then
xdg-open $filename.pdf
elif is OS X; then
open $filename.pdf
fi
答
检测当前平台的标准方法是调用uname
:
uname=$(uname);
case "$uname" in
(*Linux*) openCmd='xdg-open'; ;;
(*Darwin*) openCmd='open'; ;;
(*CYGWIN*) openCmd='cygstart'; ;;
(*) echo 'error: unsupported platform.'; exit 2; ;;
esac;
"$openCmd" "$filename.pdf";
答
,而不是试图检测到操作系统,我建议你尝试做特征检测,即使用的东西,是不是在所有的平台上实现前,尝试检测那东西是由当前平台支持的,无论如何。你可以做这样的事情如下
if command -v xdg-open >/dev/null 2>&1; then
xdg-open $filename.pdf
elif command -v open >/dev/null 2>&1; then
open $filename.pdf
else
echo >&2 "I don't know how to open the pdf"
fi
的command -v xdg-open >/dev/null 2>&1
上面会检查是否有程序调用xdg-open
可以在你的路径。如果是这样,我们将使用它。否则,我们会尝试不同的选项。
thx很多。为什么用三个分号';'?有必要吗? – SparkAndShine
不客气。在所有情况下,如果您愿意,可以删除三个分号中的第一个,也可以删除最后一个双分号(最后一个分号中的那个)。我只是想明确陈述终止;我喜欢为所有bash语句包含单个分号终结符,而不管它们出现在哪里,并且我喜欢在所有个案分支上包含双分号。其中一个好处是它允许您将多个语句连接到一行,而不必担心添加分号。另一个好处是一致性。 – bgoldst