我一直在更新 bash 的一些默认配置文件,并且从我所关注的教程中看到,我可以使用以下命令使用新的环境设置重新加载新的配置文件:
source /etc/bash.bashrc
唯一的问题是 - 新的环境变量仅对我的当前用户可用 - 并且在我使用 sudo 时被忽略。只有当我关闭终端会话并重新加入时,它们才对 sudo 可用。
当我尝试使用:
sudo source /etc/bash.bashrc
我收到错误:
sudo: source: command not found
有没有一种简单的方法可以加载 sudo 的新 bash 配置文件设置,而无需关闭终端并重新启动?
-- 最初,我使用了一些引用变量的安装程序脚本。我发现,当我直接调用脚本时,它们可以访问变量(尽管这会导致以后创建目录时出现问题,因为我需要成为 root 用户),但使用 sudo 调用安装脚本则不行。
我通过以下简单命令进行测试证明了这一点:
echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE
第一个会输出变量的值,但第二个不会输出任何内容。
答案1
问题是这source
是一个 bash 内置命令(而不是像ls
或这样的程序grep
)。我认为一种方法是以 root 身份登录,然后执行源命令。
sudo -s
source /etc/bash.bashrc
答案2
问题不在于这source
是一个 shell 内置命令。事实上才是真正导致错误的原因command not found
,但这并不意味着如果真是这样它就会起作用。
实际问题是环境变量如何工作。它们的工作方式如下:每次启动新进程时,如果没有发生任何事情,它将继承其父进程的环境。因此,使用子 shell(例如bash
在 bash 实例中键入)并查看输出env
应该会得到与其父进程类似的结果。
但是,由于其sudo
工作方式(如其手册页中所述),sudo 会尝试剥离用户的环境并为替代用户创建一个“默认”环境,以便运行命令运行仿佛调用它的用户是调用用户(这是预期的行为),因此运行 nautilus assudo nautilus
应该在文件夹中打开一个文件夹/root
,而不是/home/yourusername
。
所以:
执行类似的操作sudo source script.sh
,sudo command
即使它有效,也无法成功为后者设置任何变量sudo command
。
为了传递环境变量,您可以告诉 sudo 保留环境(通过开关-E
;并在 sudoers 文件中拥有适当的权限)和/或将其设置为命令sudo VAR1=VALUE1 VAR2=VALUE2 command
。
答案3
使用 bash流程替代你可以做:
source <(sudo cat /etc/bash.bashrc)
答案4
关闭并重新打开终端不会改变任何事情。默认情况下,sudo 会剥离环境。要禁用此功能,请将 -E 添加到 sudo。