2016-09-06 54 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