Linux 如何确定systemd EnvironmentFile将设置的环境变量的精确集合?

Linux 如何确定systemd EnvironmentFile将设置的环境变量的精确集合?,linux,bash,environment-variables,systemd,Linux,Bash,Environment Variables,Systemd,systemd具有,它根据大量规则从文件内容设置环境变量,这些规则与shell解析该文件的方式并不完全相同 如何以与systemd本身完全相同的方式解析systemd环境文件?最可靠的方法是让systemd通过临时服务解析文件本身。因此: # emit a NUL-delimited set of key=value definitions for environment variables defined by a set of files newVarsForFile_nullsep() {

systemd具有,它根据大量规则从文件内容设置环境变量,这些规则与shell解析该文件的方式并不完全相同


如何以与systemd本身完全相同的方式解析systemd
环境文件?

最可靠的方法是让systemd通过临时服务解析文件本身。因此:

# emit a NUL-delimited set of key=value definitions for environment variables defined by a set of files
newVarsForFile_nullsep() {
  local -a extraParams=( ); local file
  (( $# )) || return 0 # no files specified, nothing to do
  for file in "$@"; do
    extraParams+=( --property=EnvironmentFile="$file" )
  done
  comm -z -23 \
    <(sort -z < <(systemd-run --user --pipe "${extraParams[@]}" grep -zvE '^INVOCATION_ID=' /proc/self/environ </dev/null)) \
    <(sort -z < <(systemd-run --user --pipe grep -zvE '^INVOCATION_ID=' /proc/self/environ </dev/null) )
}

# emit code that can be eval'd in an instance of bash to precisely define the exact variables
newVarsForFile_shellscript() {
  while IFS= read -r -d '' vardef; do
    printf '%s=%q\n' "${vardef%%=*}" "${vardef#*=}"
  done < <(newVarsForFile_nullsep "$@")
}

…发出一个shell脚本片段,当bash执行该脚本片段时,它将设置所有相同的环境变量,而将相关的
环境文件添加到服务定义中将设置这些变量。

I在systemd IRC通道中,damjan给了我一个指向正确方向的指针;到期信用证。:)由于使用了
--pipe
参数,不幸的是,这在235之前的systemd版本上不起作用。bash中的“可以评估”是不是给读者留下了一些空间,让差异重新体现出来?i、 e.该过程是否有可能以某种方式将某些字符解释为特殊字符,systemd不会这样做?@KlaasvanSchelven,因为它是bash生成的,bash消耗的,只要在过程的两侧都是bash的同一版本,解释器中没有重大缺陷,就没有分歧的余地。我的意思是“主要”——有趣的语法扩展都在POSIX标准未定义的空间中。解析带引号的字符串的工作原理通常是非常明确的;唯一的扩展是ANSI C-like字符串,它采用了不同的标准,但仍然不允许有太多的扩展空间。(可能除了添加新的反斜杠转义字符外,但这仅在生成代码使用这些字符时才相关;如果代码生成是由不知道给定转义序列的解释器版本完成的,则字符串将不会使用该转义序列——如果我们有例如,不知道
\t
存在于
$''
内部的电子解释器)
newVarsForFile_shellscript /etc/conf.d/*.conf