Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在多个Shell脚本中执行同一命令_Linux_Shell_File_Automation - Fatal编程技术网

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脚本的挑战。