壳牌扩张与heredoc

时间:2013-03-16 19:51:26

标签: bash

对于所有命令,如何在heredoc中进行子shell扩展?

例如:

file=report_$(date +%Y%m%d)
cat <<EOF > $file
    date
    hostname
    echo 'End of Report'
EOF

这样可以评估所有命令吗?

我知道

file=report_$(date +%Y%m%d)
cat <<EOF > $file
    $(date))
    $(hostname)
    $(echo 'End of Report')
EOF

可以工作,但默认情况下有没有办法指定子shell?

3 个答案:

答案 0 :(得分:7)

您可以使用sh(或bash)作为命令,而不是cat;实际上它将作为shell脚本运行:

sh <<EOF > $file
    date
    hostname
    echo 'End of Report'
EOF

答案 1 :(得分:1)

如果你想将所有行扩展为命令,那么heredoc就没用了:

file="report_$(date +%Y%m%d)"
{
  date
  hostname
  echo 'End of Report'
} >| "$file"

您也可以像这样重定向1>

file="report_$(date +%Y%m%d)"
exec 1> "$file"
date
hostname
echo 'End of Report'

答案 2 :(得分:0)

不是那样,但是:

cat << EOF | sh > $file
    date
    hostname
    echo 'End of Report'
EOF

会达到同样的效果。 (请注意,如果需要,这是一个新的sh命令 - 使用bash,而不是当前shell的子shell,因此它没有设置相同的变量。)

(编辑:我没有注意到这也是一个UUOC:无用的猫;见爆炸药丸的答案。:-))