【问题标题】:Executing The Same Command In Multiple Shell Scripts在多个 Shell 脚本中执行相同的命令
【发布时间】:2009-07-07 22:11:37
【问题描述】:

我正在使用以下命令将命令的输出转换为文件:

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

但是这不起作用。有什么方法可以描述一个文件以您在上面看到的方式创建一次但能够在脚本中重复引用它?

【问题讨论】:

    标签: linux shell file automation


    【解决方案1】:

    一种解决方案是在 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
    

    【讨论】:

      【解决方案2】:

      如果您的 shell 支持定义函数(例如 bash、korn 等),那么您可以将其放入一个函数中,并让每个脚本包含/导入/该函数所在的任何文件。

      【讨论】:

        【解决方案3】:

        导出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"

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 或者perl,或者ruby等。我是个老屁,喜欢shell脚本的挑战。
          猜你喜欢
          • 2017-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-22
          • 2012-12-22
          • 1970-01-01
          • 1970-01-01
          • 2015-11-20
          相关资源
          最近更新 更多