创建一个不解释任何东西的heredoc

时间:2016-08-05 19:59:38

标签: linux bash heredoc

我正在为一位没有bash经验的朋友写剧本。该脚本生成备份脚本,生成crontab并运行crontab以创建cron作业。

我想约会这些备份,所以目前脚本(相关内容)是:

cat <<EOF > ~/scheduledBackups/scripts/finalCutScript.bash
mkdir -p ~/scheduledBackups/FinalCut-`date +%a-%b-%d-%Y_%H`
cp -r $BACKUP_DIR/* ~/scheduledBackups/FinalCut-`date +%a-%b-%d-%Y_%H`
EOF

然而,这会生成finalCutScript.bash,其中包含运行“installer”脚本时的日期。

有没有办法在finalCutScript.bash内准确放置heredoc?我希望将所有内容保存在一个脚本中,以便以后可以使用此脚本框架。

精化

预期行为:

我希望heredoc管道的文件包含

mkdir -p ~/scheduledBackups/FinalCut-`date +%a-%b-%d-%Y_%H`
cp -r $BACKUP_DIR/* ~/scheduledBackups/FinalCut-`date +%a-%b-%d-%Y_%H`

实际行为

该heredoc生成的文件包含

mkdir -p ~/scheduledBackups/FinalCut-Fri-Aug-05-2016_16
cp -r ~/Documents//* ~/scheduledBackups/FinalCut-Fri-Aug-05-2016_16

1 个答案:

答案 0 :(得分:4)

你应该在{heredoc中EOF并使用$(...)进行命令替换:

cat <<-'EOF' >~/scheduledBackups/scripts/finalCutScript.bash
mkdir -p ~/scheduledBackups/FinalCut-$(date +%a-%b-%d-%Y_%H)
cp -r $BACKUP_DIR/* ~/scheduledBackups/FinalCut-$(date +%a-%b-%d-%Y_%H)
EOF

更新:根据下面的OP评论,您还可以转义$以便不在当前shell中展开变量:

BACKUP_DIR='foobar' # variable to be used below in here-doc

cat <<-EOF >~/scheduledBackups/scripts/finalCutScript.bash
mkdir -p ~/scheduledBackups/FinalCut-\$(date +%a-%b-%d-%Y_%H)
cp -r $BACKUP_DIR/* ~/scheduledBackups/FinalCut-\$(date +%a-%b-%d-%Y_%H)
EOF

以上命令将使用当前环境中的$BACKUP_DIR,但会在输出中添加文字$(date +%a-%b-%d-%Y_%H)