作为 sudo 运行命令和作为 sudo 运行脚本有什么区别?

作为 sudo 运行命令和作为 sudo 运行脚本有什么区别?

为什么运行命令 as 会sudo回显变量的值,但是在脚本中运行相同的命令却sudo不会回显变量值?

➜ echo "$XDG_CONFIG_HOME"
/Users/cc/.config

➜ sudo echo "$XDG_CONFIG_HOME"
/Users/cc/.config

➜ cat sample.sh
#!/usr/bin/env sh

echo "$XDG_CONFIG_HOME"


➜ ./sample.sh
/Users/cc/.config

➜ sudo ./sample.sh


PS 在linux上也尝试过,结果相似。

答案1

在 中sudo echo "$XDG_CONFIG_HOME",您的 shell 在运行之前扩展变量sudo,并sudo查看echo /Users/cc/.config它是否正常运行。

在 中sudo ./sample.shsudo启动一个 shell 来运行脚本,然后该 shell 执行扩展。现在,根据设置,sudo可能会清理环境变量,以保护特权命令免于从中获取指令。

请参阅env_resetenv_checkenv_deleteenv_keep设置,以及-E的选项sudo

sudo即使变量没有在原始 shell 中导出,您也会得到相同的效果,例如

foo=bar
echo $foo
sh -c 'echo $foo'

相关内容