我正在使用以下命令将命令输出到文件中:
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
然而,这不起作用。有没有办法用你在上面看到的方式描述一个文件来创建,但能够在脚本中重复引用它?
答案 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处理。