2009-07-07 149 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