须藤:来源:找不到命令

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 内置命令(不是程序 - 类似lsgrep)。我认为一种方法是以 root 身份登录,然后执行 source 命令。

sudo -s
source /etc/bash.bashrc
Run Code Online (Sandbox Code Playgroud)

  • 你说得对,问题在于 `source` 是一个内置的 shell。`sudo su` 是一种奇怪的表达方式——最好只说 `sudo -s`,这是 sudo 自己说“以该用户身份启动 shell”的方式。您的单行版本将不起作用,因为其中的每个命令都由主用户的 shell 在单独的子进程中运行。 (3认同)

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.


poo*_*lie 5

正如Marcos 所说,这里的主要问题是sourceshell 内置命令仅影响运行它的 shell 进程。

简单的解决方案是以 root 身份启动一个新的 shell,bash/etc/bash.bashrc启动时会自动读取。就这么简单

sudo bash
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 5

使用 bash进程替换,您可以执行以下操作:

source <(sudo cat /etc/bash.bashrc)
Run Code Online (Sandbox Code Playgroud)

  • OP 实际上是在询问如何从需要使用“sudo”访问配置文件的 shell 中“...重新加载新配置文件...”。上面提供了一种导入配置文件的方法,同时避免提到的“sudo:source:command not found”问题。 (3认同)