$ 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
效果很好,因此没有使用不同的外壳。