我正在编写脚本以在AWS临时卷上自动创建SWAP。该过程的一部分需要脚本“感知”要应用交换的nvme,因为AWS Linux可以在停止/启动时对nvme名称进行重新排序。
我正在使用Terraform运行“启动”脚本,该脚本会对实例执行大量工作。其中之一是将脚本插入/ opt / scripts,然后添加crontab,它将运行此自动交换脚本@reboot。
但是,当我运行Terraform启动脚本时,它将用我的逻辑结果而不是我想要在/opt/scripts/swap.sh中使用的实际脚本替换cat EOT。
这是我的EOT启动脚本的一部分:
# Create auto-swap script
mkdir /opt/scripts
cat <<EOT >> /opt/scripts/swap.sh
#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>/opt/scripts/swap.log 2>&1
# Create SWAP partition
sudo mkswap $(lsblk | grep "279.4G" | cut -d " " -f1 | perl -ne 'print "/dev/$_"')
sudo swapon $(lsblk | grep "279.4G" | cut -d " " -f1 | perl -ne 'print "/dev/$_"')
swapon -s
EOT
运行Terraform后,这是/opt/scripts/swap.sh内部的内容:
#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>/opt/scripts/swap.log 2>&1
# Create SWAP partition
sudo mkswap /dev/nvme1n1
sudo swapon /dev/nvme1n1
swapon -s
我需要猫EOT来将我在脚本中显示的内容完全创建到/opt/scripts/swap.sh中,而不是自己想出的/ dev / nvme1n1中。我该怎么做呢?
/opt/scripts/swap.sh的所需内容:
#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>/opt/scripts/swap.log 2>&1
# Create SWAP partition
sudo mkswap $(lsblk | grep "279.4G" | cut -d " " -f1 | perl -ne 'print "/dev/$_"')
sudo swapon $(lsblk | grep "279.4G" | cut -d " " -f1 | perl -ne 'print "/dev/$_"')
swapon -s
您需要引用定界符;现在,这里的文档被当作双引号括起来的字符串,因此命令替换被立即评估。
# Create auto-swap script
mkdir /opt/scripts
cat <<'EOT' >> /opt/scripts/swap.sh
#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>/opt/scripts/swap.log 2>&1
# Create SWAP partition
sudo mkswap $(lsblk | grep "279.4G" | cut -d " " -f1 | perl -ne 'print "/dev/$_"')
sudo swapon $(lsblk | grep "279.4G" | cut -d " " -f1 | perl -ne 'print "/dev/$_"')
swapon -s
EOT
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句