在多个Shell脚本中执行相同的命令

时间:2009-07-07 22:11:37

标签: linux shell file automation

我正在使用以下命令将命令输出到文件中:

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

然而,这不起作用。有没有办法用你在上面看到的方式描述一个文件来创建,但能够在脚本中重复引用它?

4 个答案:

答案 0 :(得分:2)

一种解决方案是在shell脚本中定义一个函数......

但是你几乎让它与导出一起工作。如果你想继续这样做,关键是要逃避$,所以在你做好准备之前,他们不会被他们的价值取代。然后使用eval稍后重新评估它。

E.g:

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 :(得分:1)

如果你的shell支持定义函数(例如bash,korn等),那么你可以将它放在一个函数中,让每个脚本都包含/ import /该函数所在的文件。

答案 2 :(得分:0)

导出LOGFILE变量不起作用的原因是,$0$1此时没有有用的值($0可能是你的shell可执行文件,$1可能没什么。一种可能性是这样的包装脚本:

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

否则你将管道发送到tee,你现在作为参数传递给包装器脚本。例如(假设它被命名为new-tee)new-tee java CMD或用于测试,new-tee echo "hello world"

答案 3 :(得分:0)

在进一步检查我的具体情况后,我认为我能做的最好的事情就是停止使用bash并升级到更强大的脚本语言,如Python。 Ethan的回答确实表明我的问题可以在Bash中得到解决,但我建议任何想要做我正在做的事情的人,他们会检查是否有更简单的方法去做他们正在做的事情,或者他们的问题可能会更好用Python处理。