![使用 BASH heredoc 有条件地试运行命令块](https://linux22.com/image/1580775/%E4%BD%BF%E7%94%A8%20BASH%20heredoc%20%E6%9C%89%E6%9D%A1%E4%BB%B6%E5%9C%B0%E8%AF%95%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4%E5%9D%97.png)
我希望我的脚本中包含一些简单的东西:
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"