这是 Make 的默认行为:“recipe”中的每一行都由单独的 shell 执行,因此没有任何内容从一行传递到另一行。
GNU Make 提供了.ONESHELL特殊目标,它指示 Make 为每个配方使用单个 shell。这样做的缺点是它适用于整个 Makefile,因此您没有单独执行的选项。
您可以使用反斜杠来组合多行:
mytarget:
aws --version ; \
eval $(aws sts assume-role ... ) ; \
aws sts get-caller-identity
如果你这样做,在每个命令后加上分号是很重要的。您还可以使用 , 之类的条件操作&&
来确保每一行在调用下一行之前都成功。
您还可以作为一个变量来保存您的访问变量,并将它们插入到您调用 AWS 操作的每一行中:
ACCESS_VARS != aws sts assume-role --role-arn arn:aws:iam::123456789012:role/SomeRole --role-session-name test | jq -r '.Credentials | "AWS_ACCESS_KEY_ID=\(.AccessKeyId) AWS_SECRET_ACCESS_KEY=\(.SecretAccessKey) AWS_SESSION_TOKEN=\(.SessionToken)"'
test:
$(ACCESS_VARS) aws sts get-caller-identity
请注意,JQ 命令与您问题中的命令不同:如果您将环境变量设置为命令的一部分,则不要使用export
.
但是,IMO 最好的解决方案是编写一个脚本来完成您的工作,然后从 Makefile 调用该脚本。这将允许您独立测试脚本,并启用完整的 shell 功能,而无需 Make 应用的额外约束。