“ sudo:来源:找不到命令”

“ sudo:来源:找不到命令”
$ source /etc/environment 

$ sudo source /etc/environment 
[sudo] password for t: 
sudo: source: command not found

似乎bash运行的 shell 与执行的shell 不同source /etc/environment,并且该 shell 没有source内置的。

但我和 root 的默认 shell 都是bash.

$ echo $SHELL
/bin/bash

如果sudo确实使用不同的外壳,为什么呢?我看见slm 的回复,但在我的情况下不明白。

答案1

source是一个 shell 内置函数,因此没有 shell 就无法执行。但是,默认情况下sudo不运行 shell。从sudo

工艺模型

当 sudo 运行命令时,它会调用 fork(2),如上所述设置执行环境,并在子进程中调用 execve 系统调用

如果你想显式执行 shell,请使用-s选项:

# sudo -s source /etc/environment

这仍然没有用,因为退出 shell 后,环境更改会丢​​失。

答案2

在领域解决问题而不是回答问题,这是获取只有 root 可以读取的文件的最明显的(对我来说)方法:

source <(sudo cat /etc/environment)

这使用流程替代。它获取命令的输出cat并将其转换为伪文件,您可以将其传递给source. source 然后在当前 shell 中运行命令。

请注意,在大多数系统上,/etc/environment是世界可读的,因此您应该能够运行这个:

source /etc/environment

答案3

sudo需要一个命令,但您提供了一个内置 shell,因此它找不到该命令。如果你写type source,你可以看到输出:source is a shell builtin并且 的输出which source是空的。

例如,sudo strace它将工作并which strace给出输出,因为 strace 是一个命令。

编辑:另外,您可以看到sudo su;sudo source /etc/environment效果很好,因此没有使用不同的外壳。

相关内容