2009-07-07 108 views
1

我用下面的對命令的輸出開球到一個文件:執行相同的命令,在多個Shell腳本

logs/`basename $0`-`basename $1`.`date +%F--%R\`.log 

而且,由於這種相同的語法在幾個不同的shell腳本屬於,我真的很喜歡它只出現一次。我首先想到的是把它放在另一個shell腳本:

export LOGFILE=logs/`basename $0`-`basename $1`.`date +%F--%R`.log 
# OR 
export LOGFILE=logs/\`basename $0\`-\`basename $1\`.\`date +%F--%R\`.log 

,並讓每個文件調用這樣的命令:

java CMD | tee $LOGFILE 

然而,這是行不通的。有沒有什麼方法可以用上面看到的方式描述要創建的文件,但能夠在腳本中反覆引用它?

回答

2

一種解決方案是在shell腳本中定義一個函數...

但你幾乎都有它的出口工作。如果你想繼續這樣做,關鍵是要逃避$'s,所以他們不會被他們的價值取代,直到你準備好了。然後使用eval稍後重新評估。

例如爲:

501 ~$ export foo='$bar' 
502 ~$ echo $foo 
$bar 
503 ~$ export bar=moo 
504 ~$ eval echo $foo 
moo 
505 ~$ export bar=hello 
506 ~$ eval echo $foo 
hello 
1

如果你的外殼支持定義功能(例如,慶典,科恩等),那麼你可以把它放在一個功能,讓每個腳本包括/進口/任何該文件的功能是英寸

0

的導出LOGFILE變量的原因不起作用,因爲$0$1在該點上沒有有用的值($0可能是您的shell的可執行文件,並且$1可能不是)。一種可能性是一個包裝腳本是這樣的:

#!/bin/sh 
LOGFILE="logs/`basename $0`-`basename $1`.`date +%F--%R`.log" 
"[email protected]" | tee "$LOGFILE" 

什麼,否則你將管發球,你現在作爲參數傳遞給包裝腳本。例如(假設它被命名爲new-tee)new-tee java CMD或用於測試,new-tee echo "hello world"

0

檢查我的具體curcumstances進一步之後,我想我能做到的最好的事情就是停止使用bash和升級到更強大的腳本語言如Python。 Ethan的回答確實表明我的問題可以在Bash中解決,但是我會建議任何想要做我所做的事情的人,他們會檢查是否沒有更簡單的方法來做他們正在做的事情,或者如果他們的問題可能會更好在Python中處理。

+0

或perl或紅寶石等我是一個老屁,喜歡shell腳本的挑戰。 – lumpynose 2009-07-09 01:17:12