代码之家  ›  专栏  ›  技术社区  ›  trollken

在bash脚本中实现干运行

  •  4
  • trollken  · 技术社区  · 7 年前

    我正在寻找一种优雅的方法来在我的一个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 回复  |  直到 7 年前
        1
  •  4
  •   Popmedic    7 年前

    由于是管道,因此需要为行中的所有命令设置“$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
    
    推荐文章