在bash脚本中实现试运行


15

如何在bash脚本中实现试运行选项?

我可以考虑将每个命令都包装在if中,然后回显该命令,而不是在脚本以空运行方式运行时运行它。

另一种方法是定义一个函数,然后将每个命令调用传递给该函数。

就像是:

function _run () {
    if [[ "$DRY_RUN" ]]; then
        echo $@
    else
        $@
    fi
}

`_run mv /tmp/file /tmp/file2`

`DRY_RUN=true _run mv /tmp/file /tmp/file2`

这是错误的,还有更好的方法吗?


因此,您要打印命令将执行的操作(包括$ VARIABLES的值),而无需实际执行命令。我使用类似您的_run()函数的功能,有时使用'set -xv',但我希望有更好的方法。
Stefan Lasiewski,2010年

是的,就是这样 我想知道是否可以在bash中设置内部变量,以使命令实际上不执行,而不是通过函数传递它们
Andrei Serdeliuc 2010年

2
没有理由将这个问题标记为社区Wiki。
暂停,直到另行通知。

Bash是一个外壳。没有理由要进行空运行。我认为没有比您已经做的更好的方法了。
d -_- b 2010年

Answers:


2

别无选择,但它看起来像是测试并使用更长的bash程序的绝佳资源。
Andrei Serdeliuc 2010年

我回滚了将锚添加到链接页面的特定部分的编辑,因为如上所述,我的回答的重点是将讨论整体阅读,而不是指向一个特定的操作方法部分。链接页面的重点通常是尝试避免将要执行的命令放入变量中,因为存在很多陷阱。
暂停,直到另行通知。

如果这个答案总结了本文的重点,那将更加有用。一线答案仍然是较差的答案。
Mark Booth

4

我想尝试@Dennis Williamson's的答案。这是我得到的:

Run () {
    if [ "$TEST" ]; then
        echo "$*"
        return 0
    fi

    eval "$@"
}

eval "$@"这里很重要,比做起来更好$*$@返回所有参数,并$*返回所有不带空格/引号的参数。

$ mkdir dir
$ touch dir/file1 dir/file2
$ FOO="dir/*"
$ TEST=true Run ls -l $FOO
ls -l dir/file1 dir/file2
$ Run ls -l $FOO
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file1
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.