Linux systemd启动的进程未看到环境变量

Linux systemd启动的进程未看到环境变量,linux,environment-variables,systemd,Linux,Environment Variables,Systemd,我有以下系统文件: [Unit] Description=Let's Encrypt renewal [Service] Type=oneshot Environment=AWS_CONFIG_FILE='/etc/letsencrypt/aws_creds_prod.ini' ExecStart=-/usr/bin/certbot renew --quiet --agree-tos --noninteractive 当它运行时,route-53-plugin抱怨它找不到任何配置值 如果我在

我有以下系统文件:

[Unit]
Description=Let's Encrypt renewal

[Service]
Type=oneshot
Environment=AWS_CONFIG_FILE='/etc/letsencrypt/aws_creds_prod.ini'
ExecStart=-/usr/bin/certbot renew --quiet --agree-tos --noninteractive
当它运行时,route-53-plugin抱怨它找不到任何配置值

如果我在命令行中执行
AWS\u CONFIG\u FILE='/etc/letsencrypt/AWS\u creds\u prod.ini'/usr/bin/certbot renew--quiet--agree tos--noninteractive
,它就可以工作

如果我创建一个如下所示的服务文件:

[Unit]
Description=Environment Test

[Service]
Type=oneshot
Environment=AWS_CONFIG_FILE='/etc/letsencrypt/aws_creds_prod.ini'
ExecStart=-/bin/echo $AWS_CONFIG_FILE
我在日志中获得了条目
Apr 13 09:35:13 host.local echo[29756]:/etc/letsencrypt/aws\u creds\u prod.ini


我忽略了什么?为什么环境变量(显然设置正确)似乎未设置到流程中?

如果删除
环境
行中的值周围的引号,没有任何区别,是吗?@Göran非常感谢,这是拼图中缺失的部分。我不知道没有它们它为什么能工作,但重要的是,它显然能工作,因为systemd服务文件的语法与POSIX shell(如bash)的语法不同。事实上,从shell提示符运行它时不需要引号,因为env var的值不包含任何shell元字符(例如空格)。@Kurtis我知道systemd不只是获取环境语句中的内容并将其抛出bash。让我困惑的是,它在原则上确实有效(或者echo不会像它那样工作),但它不适用于certbot。如何在设置环境变量的同时又不设置环境变量?它是设置的。您的echo命令正在有效地运行,正如您键入的那样:
/bin/sh-c”/bin/echo$AWS\u CONFIG\u FILE“
。shell正在对命令执行其通常的带引号的字符串解析和空格拆分。从而从输出中删除单引号字符。将
/bin/echo$AWS\u CONFIG\u文件替换为
/bin/echo“$AWS\u CONFIG\u文件”
,以了解我的意思。
certbot
命令直接从环境中检索env var的值,因此获取作为路径名一部分的单引号。