2010-11-23 86 views
5

我有一個makefile,它運行需要一段時間的命令。如果構建是從交互式shell啓動的,但是不安靜(特別是通過cron),那麼我會希望這些命令很健談。 (僞代碼):如何判斷makefile是否從交互式shell運行?

foo_opts = -a -b -c 
if (make was invoked from an interactive shell): 
    foo_opts += --verbose 

all: bar baz 
    foo $(foo_opts) 

這是GNU make。如果我所做的事情的細節很重要,我可以編輯這個問題。

回答

5

它不是嚴格地確定它是否從交互式shell中調用,但對於將輸出重定向到文件的cron作業,此問題的答案與How to detect if my shell script is running through a pipe?的相同:

if [ -t 0 ] 
then 
    # input is from a terminal 
fi 

編輯:要使用此設置一個變量在一個Makefile(在GNU做,這是):

INTERACTIVE:=$(shell [ -t 0 ] && echo 1) 

ifdef INTERACTIVE 
# is a terminal 
else 
# cron job 
endif 
4

http://www.faqs.org/faqs/unix-faq/faq/part5/section-5.html

5.5)我怎樣才能知道我是否正在運行一個交互式的殼呢?

In the C shell category, look for the variable $prompt. 

    In the Bourne shell category, you can look for the variable $PS1, 
    however, it is better to check the variable $-. If $- contains 
    an 'i', the shell is interactive. Test like so: 

     case $- in 
     *i*) # do things for interactive shell 
       ;; 
     *)  # do things for non-interactive shell 
       ;; 
     esac 
+1

對不起,你的遊行隊伍下雨了,但是它告訴你你運行的shell是否是交互式運行的,但是在makefile裏面,你運行的任何shell都會聲稱它是非交互式運行的,即使`make`是本身從交互式shell運行。證明:`makefile`包含``all:; echo「Shell:$$ - 」`「並運行'make',它不會在輸出中包含'i'。 (在我的Mac上,從我的交互式shell中,'make'與'himBH'相比'hBc')。 – 2010-11-23 00:25:16

+0

嗯..也許OP可以檢查shell中調用make並設置環境變量在makefile中捕獲。 – Naveen 2010-11-23 00:33:14

+0

環境變量排序 - 大多可用,但不是很令人滿意。 – 2010-11-23 01:13:13

4

我不認爲你可以輕易找出答案。我建議採用另一種策略,可能是通過壓縮cron作業的詳細輸出。我是這樣看,使用這樣的生成文件做:

VERBOSE = --verbose 

foo_opts = -a -b -c ${VERBOSE} 

all: bar baz 
    foo $(foo_opts) 

然後,在cron作業,指定:

make VERBOSE= 

此詳細的命令行規範覆蓋了一個在生成文件(和不能被makefile改變)。這樣,您設置並使用多次的專用任務(cron job)將在沒有詳細輸出的情況下完成;構建的一般任務將會被詳細地完成(除非您選擇覆蓋命令行上的詳細內容)。

這種技術的一個小優點是它可以與make的任何變體一起使用;它不依賴任何GNU Make工具。

0

我真的不知道什麼是「我互動」的意思。你是說如果你有一個有效的/dev/tty?如果是這樣,那麼你可以檢查。但是,我們大多數人在stdin上檢查isatty,因爲它回答了我們想知道的問題:是否有人在那裏鍵入內容。

0

請注意:您還可以看到the related discussion,我有關於檢測從Makefile中重定向STDOUT的信息。

我相信這將有助於這個問題的讀者 - 執行摘要:

-include piped.mk 

all: piped.mk 
ifeq ($(PIPED),1) 
    @echo Output of make is piped because PIPED is ${PIPED} 
else 
    @echo Output of make is NOT piped because PIPED is ${PIPED} 
endif 
    @rm -f piped.mk 

piped.mk: 
    @[ -t 1 ] && PIPED=0 || PIPED=1 ; echo "PIPED=$${PIPED}" > piped.mk 

$ make 
Output of make is NOT piped because PIPED is 0 

$ make | more 
Output of make is piped because PIPED is 1 

在我的答案在那裏我解釋爲什麼[-t 1]有一個動作,而不是在一個變量賦值來完成(如在這裏推薦的答案),以及關於重新評估生成的Makefile(即上面的piped.mk)的各種陷阱。

該術語互動在這個問題似乎暗示重定向STDIN ...在這種情況下,在上面的代碼中用[ -t 0 ]代替[ -t 1 ]應該按原樣工作。

希望這會有所幫助。

相關問題