«Sudo: source: команда не найдена»

15
$ source /etc/environment 

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

Кажется, что оболочка, отличная от bashзапускаемой source /etc/environment, не имеет sourceвстроенной оболочки .

Но мой и корень по умолчанию оболочки оба bash.

$ echo $SHELL
/bin/bash

Если sudoIndeeds использует другую оболочку, почему? Я видел ответ SLM , но не понимаю, в моем случае.

StackExchange для всех
источник
4
sourceвстроенная оболочка .. вы не можете использовать sudoдля запуска встроенную оболочку как внешнюю команду ..
heemayl
Проблема в том, что вы не можете прочитать файл или хотите, чтобы среда, определенная в файле, применялась к последующим командам sudo?
Random832
@ Random832: хотите, чтобы среда, определенная в файле, применялась к последующим командам sudo
StackExchange for All

Ответы:

23

sourceэто встроенная оболочка, поэтому она не может быть выполнена без оболочки. Однако по умолчанию sudoне запускается оболочка. Изsudo

Модель процесса

Когда sudo запускает команду, она вызывает fork (2), устанавливает среду выполнения, как описано выше, и вызывает системный вызов execve в дочернем процессе.

Если вы хотите явно выполнить оболочку, используйте -sопцию:

# sudo -s source /etc/environment

Что по-прежнему бесполезно, потому что после выхода из оболочки изменения среды теряются.

myaut
источник
7

В плане решения проблемы, а не ответа на вопрос , вот наиболее очевидный (для меня) способ получения файла, который может прочитать только root:

source <(sudo cat /etc/environment)

Это использует процесс замены . Он принимает выходные данные catкоманды и превращает их в псевдофайл, который вы можете передать source. Затем источник запускает команды в текущей оболочке.

Обратите внимание, что на большинстве систем /etc/environmentон доступен для чтения всем, поэтому вы должны просто выполнить это:

source /etc/environment
Kevin
источник
1
это работает, принятый нет
Claudiu Creanga
2

sudoожидает команду, но вы даете встроенную оболочку, поэтому она не может найти команду. Если вы напишите type source, вы увидите вывод: source is a shell builtinи вывод which sourceпуст.

Например, sudo straceбудет работать и which straceвыдаст вывод, потому что strace - это команда.

Редактировать: Кроме того, вы можете видеть sudo su;sudo source /etc/environmentработы хорошо, поэтому не используется другая оболочка.

Esref
источник