我一直在更新 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 内置命令(不是程序 - 像ls
orgrep
)。我认为一种方法是以 root 身份登录,然后执行 source 命令。问题不在于
source
shell 内置命令。事实上,它实际上是给你抛出command not found
错误的原因,但这并不意味着它会起作用。实际的问题是环境变量是如何工作的。它们的工作方式是这样的:每次启动一个新进程,如果什么都没发生,它就会继承其父进程的环境。因此,使用子shell(例如
bash
在bash 实例中键入)并查看的输出env
应该会得到与其父级相似的结果。但是,由于
sudo
工作方式(如其手册页中所述),sudo 尝试剥离用户的环境并为替换用户创建一个“默认”环境,以便命令运行就像调用它的用户一样运行是调用用户(这是预期的行为),因此运行 nautilussudo nautilus
应该在该文件夹中打开一个文件/root
夹,而不是/home/yourusername
.所以:
做类似的事情
sudo source script.sh
thensudo command
,即使它有效,也不会成功地将任何变量设置为 latersudo command
。为了传递环境变量,您可以告诉 sudo 保留环境(通过
-E
开关;并在 sudoers 文件中具有适当的权限)和/或将命令设置为sudo VAR1=VALUE1 VAR2=VALUE2 command
.使用 bash进程替换,您可以执行以下操作:
正如马科斯所说,这里的主要问题
source
是一个 shell 内置命令,它只影响运行它的 shell 进程。简单的解决方案是以 root 身份启动一个新的 shell,bash 会
/etc/bash.bashrc
在它启动时自动读取。就这么简单关闭和重新打开终端不应改变任何事情。默认情况下, sudo 剥离环境。要禁用它,请将 -E 添加到 sudo。
发生错误是因为您尝试从命令行调用的二进制文件只是当前用户的 PATH 变量的一部分,而不是 root 用户的 PATH 的一部分。
您可以通过定位您尝试访问的二进制文件的路径来验证这一点。就我而言,我试图称之为“bettercap-ng”。于是我跑了,
我检查了这个位置是否是我的根用户路径的一部分。
所以 sudo 找不到我试图从命令行调用的二进制文件。因此返回未找到的错误命令。
在调用如下所示的二进制文件时,您可以指示 sudo 使用当前用户的 PATH。
事实上,可以用它做一个别名:
也可以将别名本身命名为 sudo,替换原来的 sudo。
某些 UNIX shell 不支持
source
. 相反,他们支持.
所以试试这个希望它有效
它不起作用,因为
source
它是内置命令,而不是程序。我写了一个 bash 脚本来强制 sudo 使用内置命令:将文件另存为
forceSudo
并将其保存在您的脚本位置,可能是~/.local/bin
. 为避免在使用该函数之前必须获取文件,请添加alias forceSudo='unalias forceSudo && . forceSudo && forceSudo "$@"'
到~/.bashrc
.现在您可以使用
forceSudo source /etc/bash.bashrc
.