Linux 在多个Shell脚本中执行同一命令
我使用以下方法将命令的输出转换为文件:Linux 在多个Shell脚本中执行同一命令,linux,shell,file,automation,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\`-\`basenam
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
#!/bin/sh
LOGFILE="logs/`basename $0`-`basename $1`.`date +%F--%R`.log"
"$@" | tee "$LOGFILE"
然而,这不起作用。是否有任何方法可以描述一个文件,以上面所述的方式创建一次,但可以在脚本中重复引用它?如果您的shell支持定义函数(例如bash、korn等)然后你可以把它放在一个函数中,让每个脚本包含/导入/函数所在的任何文件。导出
LOGFILE
变量不起作用的原因是$0
和$1
在这一点上没有有用的值($0
可能是您的shell的可执行文件,$1
可能什么都不是)。一种可能是这样的包装器脚本:
java CMD | tee $LOGFILE
#!/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”
一个解决方案是在shell脚本中定义一个函数
但您几乎可以将其用于导出。如果您想继续这样做,关键是要退出$,这样在您准备好之前,它们不会被替换为其值。然后使用eval
稍后重新评估它
例如:
在进一步研究了我的具体情况之后,我认为我能做的最好的事情就是停止使用bash,升级到一种更强大的脚本语言,比如Python。Ethan的回答确实表明我的问题可以在bash中得到解决,但我建议任何想做我正在做的事情的人,如果没有更简单的方法来做什么,他们会检查他们在做什么,或者他们的问题是否可以用Python更好地处理。或者perl,或者ruby,等等。我是个老屁,喜欢shell脚本的挑战。