2012-06-21 61 views
1

我見過一些shell腳本,它們通過在同一個shell腳本中編寫文件的內容來傳遞文件。例如:如何在Makefile中編寫內聯文件

if [[ $uponly -eq 1 ]]; then 
    mysql $tabular -h database1 -u usertrack -pabulafia usertrack << END                       

    select host from host_status where host like 'ld%' and status = 'up';                       

END 
    exit 0 
fi 

我已經能夠做類似的在我做了什麼:

python << END 
print 'hello world' 
END 

如果腳本的名稱是說myscript.sh那麼我可以通過執行sh myscript.sh運行它。我獲得了我想要的結果。

問題是,我們可以在Makefile中做類似的事嗎?我一直在環顧四周,他們都說我做了類似的事情:

target: 
     python @<< 
print 'hello world' 
<< 

但這並不奏效。

這裏是鏈接,我一直在尋找:

http://www.opussoftware.com/tutorial/TutMakefile.htm#Response%20Files

http://www.scribd.com/doc/2369245/Makefile-Memo

回答

2

你可以做這樣的事情:

define TMP_PYTHON_PROG 
print 'hello' 
print 'world' 
endef 

export TMP_PYTHON_PROG 
target: 
    @python -c "$$TMP_PYTHON_PROG" 

首先,你定義一個多線變量defineendef。那麼你需要將其export它的外殼,否則它會把每一個新行作爲一個新的命令。然後使用$$重新插入shell變量。

+0

謝謝主席先生。效果很好。 – jmlopez

3

你的@<<事情不起作用的原因是,它似乎是一個非標準的make變種的功能。同樣,mVChr提到的define命令也是特定的(就我所知)到GNU Make。雖然GNU Make的分佈非常廣泛,但這個技巧在BSD make中不適用,也不適用於POSIX only版本。

作爲一般原則,我認爲保持makefiles儘可能便攜是很好的;如果你正在自動配置系統的環境下編寫一個Makefile,它仍然更重要。

去做你在找什麼

完全可移植的方法是:

target: 
    { echo "print 'First line'"; echo "print 'second'"; } | python 

或等價地,如果你想展示出來的東西多一點整齊:

target: 
    { echo "print 'First line'"; \ 
     echo "print 'second'"; \ 
    } | python 
相關問題