sudo:源:未找到命令

sudo:源:未找到命令

我一直在更新 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.shsudo command即使它有效,也无法成功为后者设置任何变量sudo command

为了传递环境变量,您可以告诉 sudo 保留环境(通过开关-E;并在 sudoers 文件中拥有适当的权限)和/或将其设置为命令sudo VAR1=VALUE1 VAR2=VALUE2 command

答案3

使用 bash流程替代你可以做:

source <(sudo cat /etc/bash.bashrc)

答案4

关闭并重新打开终端不会改变任何事情。默认情况下,sudo 会剥离环境。要禁用此功能,请将 -E 添加到 sudo。

相关内容