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


15
$ source /etc/environment 

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

似乎与bash要执行的外壳不同,source /etc/environment并且外壳没有source内置的外壳。

但是my和root的默认shell都是bash

$ echo $SHELL
/bin/bash

如果sudo确实使用了不同的外壳,为什么呢?我看到了slm的回复,但对我的情况不了解。


4
source是壳builtin..you不能使用sudo运行shell内建等的外部命令..
heemayl

是您无法读取文件,还是希望文件中定义的环境应用于后续sudo命令的问题?
Random832

@ Random832:希望文件中定义的环境适用于后续的sudo命令
StackExchange for All

Answers:


23

source是内置的Shell,因此没有Shell便无法执行。但是,默认情况下,sudo不要运行shell。从sudo

工艺模型

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

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

# sudo -s source /etc/environment

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


7

解决问题而不是回答问题的领域中,这是(对我而言)最明显的方法来获取仅root用户可以读取的文件:

source <(sudo cat /etc/environment)

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

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

source /etc/environment

1
这行得通,被接受的行不通
Claudiu Creanga '18

2

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

例如sudo stracewhich strace由于strace是命令,因此可以工作并给出输出。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.