使用 BASH heredoc 有条件地试运行命令块

使用 BASH heredoc 有条件地试运行命令块

我希望我的脚本中包含一些简单的东西:

set_dryrun()
{
    BEGIN='cat << EOF'
    END='EOF'
}

[ "$1" == "-dryrun" ] && set_dryrun

${BEGIN}
    ls -l
${END}

因此,如果我使用参数运行它,和-dryrun之间的命令只会被打印,但不会执行。${BEGIN}${END}

如果我没有带旗帜,一切都会顺利-dryrun

$ ./dryrun_opt 
-rwxrwxr-x 1 arantesj arantesj 160 jan 25 17:15 dryrun_opt

但是,通过-dryrun,我看到:

$ ./dryrun_opt -dryrun
cat: '<<': No such file or directory
cat: EOF: No such file or directory
-rwxrwxr-x 1 arantesj arantesj 160 jan 25 17:16 dryrun_opt
./dryrun_opt: line 14: EOF: command not found

嗯...我知道我没有正确地替换(扩展?)我的 heredoc,但是如果可能的话我该怎么做?

提前致谢。

答案1

这对我有用:

set_dryrun()
{
    BEGIN='cat << EOF'
    END='EOF'
}

[ "$1" == "-dryrun" ] && set_dryrun

eval "${BEGIN}
    ls -l
${END}"

然而,我怀疑当 heredoc 变得比 更复杂时,整个方法都会在某个时候失效'ls -l'。如果其中有引用或转义,则需要小心处理,否则这种简单的方法可能会失效。

借鉴此 Stack Overflow 线程,您可能会发现这种方法值得考虑:

if [ "$1" == "-dryrun" ]
then
        CMD="cat"
else
        CMD="bash"      # your preferred shell here
fi

WORK="$(cat <<'EOF'
# abc'asdf"
# $(dont-execute-this)
# foo"bar"''
ls -l
echo "$PATH"
echo "\$PATH"
EOF
)"

$CMD <<< "$WORK"

相关内容