在bash脚本中实现空运行

时间:2018-04-24 13:09:36

标签: bash function shell scripting eval

我正在寻找一种在我的一个bash脚本中实现干运行的优雅方法。 我找到了多种方法,但它们都不符合我的需求。

其中一个包括编写一个干运行函数,如下所示:https://gist.github.com/pablochacin/32442fbbdb99165d6f7c

但是我想要执行的一些命令包括管道,而且这种方法与管道兼容。 例如,我想在干运行中执行此操作:

tar cf - drytestfile | 7z a -m0=lzma2 -mx=9 -mmt=$nbCores -si drytestfile.tar.7z | tee -a /tmp/testlog

使用上面的方法,我将在我的脚本中有这个,其中$ DRYRUN包含执行所有参数回显的函数的名称:

$DRYRUN tar cf - drytestfile | 7z a -m0=lzma2 -mx=9 -mmt=$nbCores -si drytestfile.tar.7z | tee -a /tmp/testlog

当然,这将在命令的第一部分(即tar)上运行该函数,并使用此函数的结果提供7z。 不是我真正想要的。

也许与eval命令有关,但我仍然无法弄清楚如何实现... 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

由于你正在管道,你需要拥有" $ DRYRUN"对于该行中的所有命令。如果您只是在所有命令前面添加$ DRYRUN,那么它将起作用,但您只能看到最后一个命令的输出。如果你想显示所有命令,一种方法是改变dryrun函数,即(根据Charles Duffy编辑评论):

dryrun() {
    if [[ ! -t 0 ]]
    then
        cat
    fi
    printf -v cmd_str '%q ' "$@"; echo "DRYRUN: Not executing $cmd_str" >&2
}

然后你可以这样做:

$DRYRUN tar cf - drytestfile | \
$DRYRUN 7z a -m0=lzma2 -mx=9 -mmt=$nbCores -si drytestfile.tar.7z | \
$DRYRUN tee -a /tmp/testlog

例如:

dryrun echo "hello" | \
dryrun echo "world" | \
dryrun echo "foo" | \
dryrun echo "bar"

将产生:

DRYRUN: Not executing command echo hello
DRYRUN: Not executing command echo world
DRYRUN: Not executing command echo foo
DRYRUN: Not executing command echo bar