"Sudo: джерело: команда не знайдена"


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

Якщо в sudoіндексах використовується інша оболонка, чому це? Я побачив відповідь SLM , але в моєму випадку не розумію.


4
sourceце оболонка вбудована .. ви не можете використовувати sudoдля запуску вбудовану оболонку, як зовнішню команду ..
heemayl

Це проблема, яку ви не можете прочитати файл, або ви хочете, щоб середовище, визначене у файлі, застосовувалося до наступних команд sudo?
Випадково832

@ Random832: хочу, щоб середовище, визначене у файлі, застосовувалося до наступних команд sudo
Тім

Відповіді:


23

sourceє вбудованою оболонкою, тому її неможливо виконати без оболонки. Однак за замовчуванням sudoне запускайте оболонку. Зsudo

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

Коли sudo запускає команду, вона викликає fork (2), встановлює середовище виконання, як описано вище, і викликає системний виклик execve в дочірньому процесі

Якщо ви хочете явно виконати оболонку, скористайтеся -sопцією:

# sudo -s source /etc/environment

Що досі марно, оскільки після закінчення роботи оболонки втрачаються зміни середовища.


7

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

source <(sudo cat /etc/environment)

Для цього використовується процес заміщення . Він бере висновок catкоманди і перетворює її в псевдофайл, до якого ви можете передати source. Потім джерело виконує команди в поточній оболонці.

Зауважте, що в більшості систем /etc/environmentє легким для читання у світі, тому ви повинні мати змогу просто запустити це:

source /etc/environment

1
це працює, прийнятого немає
Клавді Кріанга,

2

sudoочікує команди, але ви даєте вбудовану оболонку, щоб вона не могла знайти команду. Якщо ви пишете type source, ви можете бачити вихід: source is a shell builtinі вихід which sourceпорожній.

Наприклад, sudo straceбуде працювати і which straceдасть вихід, тому що strace - це команда.

Редагувати: також ви можете sudo su;sudo source /etc/environmentдобре працювати, тому різні оболонки не використовуються.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.