我有一个脚本可以导出一些变量,并在某些地方使用sudo
.
这是一个简单的例子:
export Name=John
sudo envsubst < SourceFile > TargetFile
如果其中SourceFile
有$Name
变量,那么它将被打印为空。
如果我删除sudo
它就可以了。
是否export
对所有用户通用?如何导出整个机器的变量?
答案1
默认情况下,sudo
清除其环境,除了作为安全措施传递的一些已清理的变量(以及一些明确设置为正常值的变量)之外。
如果 sudo 配置允许,您可以使用-E
/--preserve-env
变量来解决这个问题。
无论如何,环境变量,如命令参数,是在执行时从一个命令传递到另一个命令的东西,它不是存在于每个进程访问的某个虚幻空间中的东西(为此,有文件系统),所以出口英整个机器的变量没有意义。
此外,该envsubst
命令不需要任何特殊权限,因此将其作为root
.如果您这样做是为了尝试打开源文件或将目标文件创建为root
,那么这是错误的,因为:
sudo envsubst < SourceFile > TargetFile
重定向是由 shellsudo
以原始用户身份调用来完成的。
这是一个打开您需要运行的文件的命令root
:
sudo cat SourceFile | envsubst | sudo sh -c 'exec cat > TargetFile'
这里用于cat
打开(读取和传递)SourceFile,以及sh
打开TargetFile(并向cat
其中写入数据)。
如果在 GNU 系统上,你还可以这样做:
sudo dd bs=64k status=none if=SourceFile |
envsubst |
sudo dd bs=64k status=none of=TargetFile
看Unix 是否有从 stdin 读取并写入文件的命令(例如 tee 而不将输出发送到 stdout)?了解详细信息和其他方法。