sudo 导致 envsubst 打印空输出

Ali*_*EXE 2 sudo environment-variables

我有一个脚本可以导出一些变量,并在某些地方使用sudo.

这是一个简单的例子:

export Name=John
sudo envsubst < SourceFile > TargetFile
Run Code Online (Sandbox Code Playgroud)

如果SourceFile有一个$Name变量,那么它将被打印为空。

如果我删除sudo它就可以了。

是否export对所有用户通用?如何导出整个机器的变量?

Sté*_*las 10

默认情况下,sudo清除其环境,除了作为安全措施传递的一些经过清理的变量(以及一些明确设置为正常值的变量)。

如果 sudo 配置允许,您可以使用-E/--preserve-env变量来解决这个问题。

无论如何,环境变量,如命令参数,是在执行时从一个命令传递到另一个命令的东西,它不是存在于每个进程访问的某个虚幻空间中的东西(为此,有文件系统)所以导出整个机器的变量没有意义。

此外,该envsubst命令不需要任何特殊权限,因此将其作为root. 如果您这样做是为了尝试打开源文件或将目标文件创建为root,那么这是错误的,因为:

sudo envsubst < SourceFile > TargetFile
Run Code Online (Sandbox Code Playgroud)

重定向是由 shellsudo以原始用户身份调用来完成的。

这是一个打开您需要运行的文件的命令root

sudo cat SourceFile | envsubst | sudo sh -c 'exec cat > TargetFile'
Run Code Online (Sandbox Code Playgroud)

这里用于cat打开(读取和传递)SourceFile,以及sh打开TargetFile(并向cat其中写入数据)。

如果在 GNU 系统上,你还可以这样做:

sudo dd bs=64k status=none if=SourceFile |
  envsubst |
  sudo dd bs=64k status=none of=TargetFile
Run Code Online (Sandbox Code Playgroud)

请参阅Unix 是否有从 stdin 读取并写入文件的命令(如 tee 而不将输出发送到 stdout)?了解详细信息和其他方法。