Hor*_*Kol 75 command-line bash sudo
我一直在更新 bash 的一些默认配置文件,并从我遵循的教程中看到,我可以使用以下方法使用新的环境设置重新加载新的配置文件:
source /etc/bash.bashrc
Run Code Online (Sandbox Code Playgroud)
唯一的问题是 - 新的环境变量仅对我当前的用户可用 - 在我使用 sudo 时被忽略。只有当我关闭终端会话并重新加入时,它们才对 sudo 可用。
当我尝试使用:
sudo source /etc/bash.bashrc
Run Code Online (Sandbox Code Playgroud)
我收到错误:
sudo: source: command not found
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以加载 sudo 的新 bash 配置文件设置,而无需关闭终端并重新启动?
-- 最初,我使用了一些引用变量的安装程序脚本。我发现虽然当我直接调用脚本时他们可以访问变量(尽管这会导致以后创建目录时出现问题,因为我需要成为 root),但使用 sudo 调用安装脚本不会。
我通过使用这些简单的命令进行测试来证明这一点:
echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE
Run Code Online (Sandbox Code Playgroud)
第一个将输出变量的值,但第二个不会输出任何内容。
Mar*_*ior 101
问题是这source
是一个 bash 内置命令(不是程序 - 类似ls
或grep
)。我认为一种方法是以 root 身份登录,然后执行 source 命令。
sudo -s
source /etc/bash.bashrc
Run Code Online (Sandbox Code Playgroud)
ssi*_*ice 16
问题不在于这source
是一个 shell 内置命令。事实上,它实际上是向您抛出command not found
错误的原因,但这并不意味着它会起作用。
实际问题是环境变量如何工作。它们是这样工作的:每次启动一个新进程时,如果没有任何反应,它就会继承其父进程的环境。因此,使用子 shell(例如bash
在 bash 实例中键入)并查看 的输出env
应该给出与其父级相似的结果。
但是,由于sudo
工作方式(如其联机帮助页中所述),sudo 尝试剥离用户的环境并为替换用户创建一个“默认”环境,以便运行命令运行就像调用它的用户一样一直是调用用户(这是预期的行为),因此运行 nautilussudo nautilus
应该在文件夹中打开一个文件/root
夹,而不是/home/yourusername
.
所以:
做类似sudo source script.sh
然后的事情sudo command
,即使它奏效了,它也不会成功地将任何变量设置为之后的sudo command
.
为了传递环境变量,您可以告诉 sudo 保留环境(通过-E
开关;并在 sudoers 文件中具有适当的权限)和/或将其设置为sudo VAR1=VALUE1 VAR2=VALUE2 command
.
正如Marcos 所说,这里的主要问题是source
shell 内置命令仅影响运行它的 shell 进程。
简单的解决方案是以 root 身份启动一个新的 shell,bash/etc/bash.bashrc
启动时会自动读取。就这么简单
sudo bash
Run Code Online (Sandbox Code Playgroud)
使用 bash进程替换,您可以执行以下操作:
source <(sudo cat /etc/bash.bashrc)
Run Code Online (Sandbox Code Playgroud)