问题描述
我一直在更新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
第一个输出变量的值,但第二个不输出任何值。
最佳解决办法
问题是source
是一个bash build-in命令(不是程序 – 如ls
或grep
)。我认为一种方法是以root用户身份登录,然后执行source命令。
sudo -s
source /etc/bash.bashrc
次佳解决办法
问题不在于source
是shell内置命令。它实际上是扔你command not found
错误的事实,但并不意味着它会起作用。
实际问题是环境变量如何工作。它们的工作方式如下:每次启动新进程时,如果没有任何反应,它将继承其父进程的环境。因此,使用子shell(例如在bash实例中键入bash
)并查看env
的输出应该得到与其父级相似的结果。
但是,由于sudo
的工作方式(如其联机帮助页中所述),sudo尝试剥离用户的环境并为替换用户创建”default”环境,以便运行命令运行,就像调用它的用户一样调用用户(这是预期的行为),因此运行nautilus作为sudo nautilus
应该在/root
文件夹中打开一个文件夹,而不是/home/yourusername
。
所以:
做一些像sudo source script.sh
然后再做sudo command
的事情,即使它起作用,它也不会成功地将任何变量设置为后面的sudo command
。
为了传递环境变量,您可以告诉sudo保留环境(通过-E
开关;在sudoers文件中具有适当的权限)和/或将命令设置为sudo VAR1=VALUE1 VAR2=VALUE2 command
。
第三种解决办法
作为Marcos says,您的主要问题是source
是一个shell内置命令,它只影响运行它的shell进程。
简单的解决方案是以root身份启动一个新的shell,bash会在启动时自动读取/etc/bash.bashrc
。这就像说的一样简单
sudo bash
第四种办法
关闭和重新开放终端不应该改变事情。默认情况下,sudo剥离环境。要禁用它,请将-E添加到sudo。