3

如何在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?

4

3 回答 3

8

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

sh <<EOF > $file
    date
    hostname
    echo 'End of Report'
EOF
于 2013-03-16T19:56:03.157 回答
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'
于 2013-03-17T11:27:04.750 回答
0

不是那样,但是:

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

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

(编辑:我没有注意到这也是 UUOC:猫的无用用途;请参阅 Explosion Pills 的回答。:-))

于 2013-03-16T19:54:42.757 回答