在不同行中使用双引号的 Puppet heredoc
Puppet heredoc with double-quotes in different lines
我想将多行命令传递到 Puppet (4.10.12) exec
资源中。以下失败 "syntax error at 'sudo'":
exec { 'create databases':
command => $("EOT")
sudo -u postgres psql -c
"CREATE DATABASE db1 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
CREATE DATABASE db2 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
CREATE DATABASE db3 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'"
|-EOT,
}
我认为这个案例的挑战在于两个双引号出现在不同的行上。那么对于这种情况,正确的 heredoc 语法是什么?
我相信您需要将 L
开关添加到您的 heredoc,并在每行的末尾添加一个 \
以转义新行。
$command = $("EOT"/L)
sudo -u postgres psql -c\
"CREATE DATABASE db1 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';\
CREATE DATABASE db2 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';\
CREATE DATABASE db3 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'"
|-EOT
exec { 'create databases':
command => $command,
}
您可以在 "suppressing literal line breaks" 下查看文档 here。
以下现在有效:
exec { 'create databases':
command => @("EOT"/L)
sudo -u postgres psql \
-c "CREATE DATABASE db1 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'" \
-c "CREATE DATABASE db2 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'" \
-c "CREATE DATABASE db3 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'"
|-EOT
}
需要进行以下更改:
- 使用“@”而不是“$”来引用 heredoc(打字错误)
- 使用三个
-c
选项而不是一个(为了避免错误 CREATE DATABASE cannot be executed from a function or multi-command string
)
- 使用 heredoc switch
L
(如@mardotio 所建议)
我会接受另一个答案,因为它包含一个重要元素(并且是新贡献者:-)
我想将多行命令传递到 Puppet (4.10.12) exec
资源中。以下失败 "syntax error at 'sudo'":
exec { 'create databases':
command => $("EOT")
sudo -u postgres psql -c
"CREATE DATABASE db1 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
CREATE DATABASE db2 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
CREATE DATABASE db3 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'"
|-EOT,
}
我认为这个案例的挑战在于两个双引号出现在不同的行上。那么对于这种情况,正确的 heredoc 语法是什么?
我相信您需要将 L
开关添加到您的 heredoc,并在每行的末尾添加一个 \
以转义新行。
$command = $("EOT"/L)
sudo -u postgres psql -c\
"CREATE DATABASE db1 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';\
CREATE DATABASE db2 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';\
CREATE DATABASE db3 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'"
|-EOT
exec { 'create databases':
command => $command,
}
您可以在 "suppressing literal line breaks" 下查看文档 here。
以下现在有效:
exec { 'create databases':
command => @("EOT"/L)
sudo -u postgres psql \
-c "CREATE DATABASE db1 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'" \
-c "CREATE DATABASE db2 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'" \
-c "CREATE DATABASE db3 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'"
|-EOT
}
需要进行以下更改:
- 使用“@”而不是“$”来引用 heredoc(打字错误)
- 使用三个
-c
选项而不是一个(为了避免错误CREATE DATABASE cannot be executed from a function or multi-command string
) - 使用 heredoc switch
L
(如@mardotio 所建议)
我会接受另一个答案,因为它包含一个重要元素(并且是新贡献者:-)