2016-09-06 53 views
2

我有一段代码来编译一个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 

回答

4

检测当前平台的标准方法是调用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"; 
+0

thx很多。为什么用三个分号';'?有必要吗? – SparkAndShine

+1

不客气。在所有情况下,如果您愿意,可以删除三个分号中的第一个,也可以删除最后一个双分号(最后一个分号中的那个)。我只是想明确陈述终止;我喜欢为所有bash语句包含单个分号终结符,而不管它们出现在哪里,并且我喜欢在所有个案分支上包含双分号。其中一个好处是它允许您将多个语句连接到一行,而不必担心添加分号。另一个好处是一致性。 – bgoldst

3

,而不是试图检测到操作系统,我建议你尝试做特征检测,即使用的东西,是不是在所有的平台上实现前,尝试检测那东西是由当前平台支持的,无论如何。你可以做这样的事情如下

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可以在你的路径。如果是这样,我们将使用它。否则,我们会尝试不同的选项。

+0

这是聪明的,+1。但应该指出的是,这不是100%的万无一失。一个名字相同的命令可能存在于不同的平台上,即使它不是预期的命令。对于'command -v',即使存在具有相同名称的别名或shell函数,也可能会导致代码崩溃。 – bgoldst

+1

好点。我不会担心'xdg-open',但是'open'确实太泛化了。 – redneb