Почему «$ sudo echo 'yo'» работает, хотя echo — это встроенная функция оболочки?

Почему «$ sudo echo 'yo'» работает, хотя echo — это встроенная функция оболочки?

Я это понимаю

sudo cd /directory

вернется:

sudo: cd: command not found

потому что cd — это встроенная оболочка, а не двоичный файл. Но тогда почему

sudo echo 'this is a test'

работает отлично?

Что тут на самом деле происходит? Как sudoнайти команду, echoесли это не оболочка?

решение1

Причина проста: cdэто встроенная функция оболочки (и функция оболочки в некоторых оболочках), в то время как echoявляется как двоичным файлом, так и встроенной функцией оболочки:

$ type -a cd  
cd is a shell builtin
$ type -a echo 
echo is a shell builtin
echo is /bin/echo

sudoне может обрабатывать встроенные функции оболочки, но может обрабатывать двоичные файлы в $PATH. Когда вы используете sudo echo, /bin/echoнаходится в $PATH, поэтому он использует его, в то время как sudo cdне может найти cdв , $PATHпоэтому он терпит неудачу.

решение2

бег

 which echo

дает

 /bin/echo

echoявляется простой программой и sudoможет «найти» ее.

Кстати, должен быть какой-то вариантsudoers(5)

решение3

Проблема скорее в sudo cdнеудаче вашей ОС, чем sudo echoв успехе.

sudo cd /directoryrootвполне законный метод проверки , разрешен ли пользователю, вероятно, здесь, доступ cdк некоторому каталогу. Вот почему все совместимые с Posix ОСделатьпредоставить исполняемую версию cd.

Итак, ответ на ваш вопрос - sudo echo yoработает по замыслу, поскольку echoпредоставляется как псевдонимом оболочки, так и исполняемой командой, но sudo cd /directoryне работает, потому что ваша ОС, скорее всего, основанная на Gnu/Linux, неисправна.стандарт Posixв данном конкретном случае.

Простым решением для вашей системы будет запускsudo sh -c "cd /directory"

Связанный контент