$ source /etc/environment
$ sudo source /etc/environment
[sudo] password for t:
sudo: source: command not found
Wygląda na to, że uruchomiona jest inna powłoka niż bash
uruchomiona source /etc/environment
i ta powłoka nie ma source
wbudowanego.
Ale my i domyślna powłoka roota to obie bash
.
$ echo $SHELL
/bin/bash
Jeśli sudo
indeeds używa innej powłoki, to dlaczego? Widziałem odpowiedź SLM , ale nie rozumiem w moim przypadku.
source
jest wbudowaną powłoką .. nie można użyćsudo
do uruchomienia powłoki wbudowanej jak zewnętrzne polecenie ..Odpowiedzi:
source
jest wbudowaną powłoką, więc nie można jej wykonać bez powłoki. Jednak domyślniesudo
nie uruchamiaj powłoki. Odsudo
Jeśli chcesz jawnie wykonać powłokę, użyj
-s
opcji:Co jest nadal bezużyteczne, ponieważ po wyjściu z powłoki zmiany środowiska są tracone.
źródło
W dziedzinie rozwiązywania problemu zamiast odpowiedzi na pytanie , oto najbardziej oczywisty (dla mnie) sposób na źródło pliku, który tylko root może odczytać:
Wykorzystuje to podstawienie procesu . Pobiera dane wyjściowe
cat
polecenia i zamienia je w pseudoplik, do którego można przekazaćsource
. source następnie uruchamia polecenia w bieżącej powłoce.Pamiętaj, że w większości systemów
/etc/environment
jest czytelny na całym świecie, więc powinieneś być w stanie po prostu uruchomić to:źródło
sudo
oczekuje polecenia, ale podajesz wbudowaną powłokę, więc nie może znaleźć polecenia. Jeśli piszesztype source
, możesz zobaczyć wynik:source is a shell builtin
a wynikwhich source
jest pusty.Na przykład
sudo strace
zadziała iwhich strace
da wynik, ponieważ strace jest poleceniem.Edycja: Możesz także zobaczyć
sudo su;sudo source /etc/environment
ładnie, więc nie jest używana inna powłoka.źródło